Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Column of lists, convert list to string as a new column

I have a dataframe with a column of lists which can be created with:

import pandas as pd lists={1:[[1,2,12,6,'ABC']],2:[[1000,4,'z','a']]} #create test dataframe df=pd.DataFrame.from_dict(lists,orient='index') df=df.rename(columns={0:'lists'}) 

The dataframe df looks like:

                lists 1  [1, 2, 12, 6, ABC] 2     [1000, 4, z, a] 

I need to create a new column called 'liststring' which takes every element of each list in lists and creates a string with each element separated by commas. The elements of each list can be int, float, or string. So the result would be:

                lists    liststring 1  [1, 2, 12, 6, ABC]  1,2,12,6,ABC 2     [1000, 4, z, a]    1000,4,z,a 

I have tried various things, including from Converting a Panda DF List into a string:

df['liststring']=df.lists.apply(lambda x: ', '.join(str(x))) 

but unfortunately the result takes every character and seperates by comma:

                lists                                         liststring 1  [1, 2, 12, 6, ABC]  [, 1, ,,  , 2, ,,  , 1, 2, ,,  , 6, ,,  , ', A... 2     [1000, 4, z, a]  [, 1, 0, 0, 0, ,,  , 4, ,,  , ', z, ', ,,  , '... 

Thanks in advance for the help!

like image 698
clg4 Avatar asked Jul 25 '17 14:07

clg4


People also ask

How do I turn a list into a string?

To convert a list to a string, use Python List Comprehension and the join() function. The list comprehension will traverse the elements one by one, and the join() method will concatenate the list's elements into a new string and return it as output.


2 Answers

List Comprehension

If performance is important, I strongly recommend this solution and I can explain why.

df['liststring'] = [','.join(map(str, l)) for l in df['lists']] df                  lists    liststring 0  [1, 2, 12, 6, ABC]  1,2,12,6,ABC 1     [1000, 4, z, a]    1000,4,z,a 

You can extend this to more complicated use cases using a function.

def try_join(l):     try:         return ','.join(map(str, l))     except TypeError:         return np.nan  df['liststring'] = [try_join(l) for l in df['lists']] 

Series.apply/Series.agg with ','.join

You need to convert your list items to strings first, that's where the map comes in handy.

df['liststring'] = df['lists'].apply(lambda x: ','.join(map(str, x))) 

Or,

df['liststring'] = df['lists'].agg(lambda x: ','.join(map(str, x))) 

<!- >

df                 lists    liststring 0  [1, 2, 12, 6, ABC]  1,2,12,6,ABC 1     [1000, 4, z, a]    1000,4,z,a 

pd.DataFrame constructor with DataFrame.agg

A non-loopy/non-lambda solution.

df['liststring'] = (pd.DataFrame(df.lists.tolist())                       .fillna('')                       .astype(str)                       .agg(','.join, 1)                       .str.strip(','))  df                 lists    liststring 0  [1, 2, 12, 6, ABC]  1,2,12,6,ABC 1     [1000, 4, z, a]    1000,4,z,a 
like image 195
cs95 Avatar answered Sep 23 '22 14:09

cs95


One way you could do it is to use list comprehension, str, and join:

df['liststring'] = df.lists.apply(lambda x: ', '.join([str(i) for i in x])) 

Output:

                lists        liststring 1  [1, 2, 12, 6, ABC]  1, 2, 12, 6, ABC 2     [1000, 4, z, a]     1000, 4, z, a 
like image 35
Scott Boston Avatar answered Sep 25 '22 14:09

Scott Boston