我有一个熊猫数据框。其中一列包含一个列表。我希望该列成为单个字符串。
例如,我的列表['一个','两个'三个']应该只是一个,两个,三个'
df['col'] = df['col'].astype(str).apply(lambda x: ', '.join(df['col'].astype(str)))
给了我['一,二,三],['四'五,'六'],其中第二个列表是从下一行开始。毋庸置疑,对于数百万行,这种跨行的连接不仅不正确,而且会破坏我的记忆。
答案 0 :(得分:23)
在转换列表之前,您当然不应该转换为字符串。尝试:
df['col'].apply(', '.join)
另请注意,apply
将函数应用于系列的元素,因此在lambda函数中使用df['col']
可能不是您想要的。
编辑:感谢Yakym指出不需要lambda函数。
答案 1 :(得分:8)
当您使用col
将str
强制转换为astype
时,您将获得python列表,括号和所有内容的字符串表示形式。您不需要直接apply
join
直接执行此操作:
import pandas as pd
df = pd.DataFrame({
'A': [['a', 'b', 'c'], ['A', 'B', 'C']]
})
# Out[8]:
# A
# 0 [a, b, c]
# 1 [A, B, C]
df['Joined'] = df.A.apply(', '.join)
# A Joined
# 0 [a, b, c] a, b, c
# 1 [A, B, C] A, B, C
答案 2 :(得分:6)
您可以使用astype(str)
将列表转换为str,然后删除'
,[
,]
个字符。使用@Yakim示例:
In [114]: df
Out[114]:
A
0 [a, b, c]
1 [A, B, C]
In [115]: df.A.astype(str).str.replace('\[|\]|\'', '')
Out[115]:
0 a, b, c
1 A, B, C
Name: A, dtype: object
<强>时序强>
import pandas as pd
df = pd.DataFrame({'A': [['a', 'b', 'c'], ['A', 'B', 'C']]})
df = pd.concat([df]*1000)
In [2]: timeit df['A'].apply(', '.join)
292 µs ± 10.8 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [3]: timeit df['A'].str.join(', ')
368 µs ± 24.6 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [4]: timeit df['A'].apply(lambda x: ', '.join(x))
505 µs ± 5.74 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [5]: timeit df['A'].str.replace('\[|\]|\'', '')
2.43 ms ± 62.7 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
答案 3 :(得分:1)
Pandas为此提供了一种方法,Series.str.join
。