我有一个包含一列列表的数据框,可以使用以下命令创建:
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'})
数据框df
如下所示:
lists
1 [1, 2, 12, 6, ABC]
2 [1000, 4, z, a]
我需要创建一个名为' liststring
'的新列。它接受lists
中每个列表的每个元素,并创建一个字符串,每个元素用逗号分隔。每个列表的元素可以是int
,float
或string
。结果将是:
lists liststring
1 [1, 2, 12, 6, ABC] 1,2,12,6,ABC
2 [1000, 4, z, a] 1000,4,z,a
我尝试过各种各样的事情,包括来自Converting a Panda DF List into a string:
df['liststring']=df.lists.apply(lambda x: ', '.join(str(x)))
但不幸的是,结果会占用每个字符,并以逗号分隔:
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, ', ,, , '...
提前感谢您的帮助!
答案 0 :(得分:11)
如果性能很重要,我强烈推荐此解决方案并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
您可以使用函数将其扩展到更复杂的用例。
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
与','.join
您需要先将列表项转换为字符串,这就是map
派上用场的地方。
df['liststring'] = df['lists'].apply(lambda x: ','.join(map(str, x)))
或者,
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
的DataFrame.agg
构造函数
非循环/非lambda解决方案。
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
答案 1 :(得分:3)
您可以采用的一种方法是使用列表理解,str
和join
:
df['liststring'] = df.lists.apply(lambda x: ', '.join([str(i) for i in x]))
输出:
lists liststring
1 [1, 2, 12, 6, ABC] 1, 2, 12, 6, ABC
2 [1000, 4, z, a] 1000, 4, z, a
答案 2 :(得分:3)
前面的解释很好,很简单。但是,如果您要将多列转换为字符串分隔格式,可以说。无需进入单独的列,您可以将以下函数应用于数据框,如果有任何列是列表,则它将转换为字符串格式。
def list2Str(lst):
if type(lst) is list: # apply conversion to list columns
return";".join(lst)
else:
return lst
df.apply(lambda x: [list2Str(i) for i in x])
当然,如果您只想应用于某些列,则可以选择 列的子集如下
df[['col1',...,'col2']].apply(lambda x: [list2Str(i) for i in x])
答案 3 :(得分:2)
所有这些对我都不起作用(处理文本数据)对我有用的是:
df['liststring'] = df['lists'].apply(lambda x: x[1:-1])
答案 4 :(得分:0)
管道:
import pandas as pd
lists={1:[[1,2,12,6,'ABC']],2:[[1000,4,'z','a']]}
#create test dataframe
(
pd.DataFrame.from_dict(lists,orient='index', columns=['lists'])
.assign(liststring=lambda x: x.lists.astype(str).str[1:-1])
)
输出:
lists liststring
1 [1, 2, 12, 6, ABC] 1, 2, 12, 6, 'ABC'
2 [1000, 4, z, a] 1000, 4, 'z', 'a'