Python 将Panda DF列表转换为字符串

Python 将Panda DF列表转换为字符串,python,pandas,Python,Pandas,我有一个熊猫数据框。其中一列包含一个列表。我希望该列是单个字符串 例如,我的列表[‘一’、‘二’、‘三’]应该只是‘一、二、三’ df['col'] = df['col'].astype(str).apply(lambda x: ', '.join(df['col'].astype(str))) 给我['1,2,3],'4','5','6',其中第二个列表是从下一行开始的。不用说,对于数百万行,这种跨行连接不仅不正确,而且会消耗我的内存。当您使用astype将col强制转换为str时,您会得到

我有一个熊猫数据框。其中一列包含一个列表。我希望该列是单个字符串

例如,我的列表[‘一’、‘二’、‘三’]应该只是‘一、二、三’

df['col'] = df['col'].astype(str).apply(lambda x: ', '.join(df['col'].astype(str)))

给我['1,2,3],'4','5','6',其中第二个列表是从下一行开始的。不用说,对于数百万行,这种跨行连接不仅不正确,而且会消耗我的内存。

当您使用
astype
col
强制转换为
str
时,您会得到python列表、括号和所有内容的字符串表示形式。您不需要这样做,只需直接应用
加入

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

在转换列表之前,您当然不应该转换为字符串。尝试:

df['col'].apply(', '.join)
还要注意,
apply
将函数应用于系列元素,因此在lambda函数中使用
df['col']
可能不是您想要的


编辑:感谢您指出不需要lambda函数


Edit:如所述,有一个本机的
.str.join
方法,但它(令人惊讶地)比
apply
慢一点。您可以使用
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)

熊猫提供了一种方法,谢谢。Yakym的代码更优雅:)不需要lambda函数。如果列表中的项是
int
types@KhalilAlHooti这应该有效:
df['col'].apply(lambda x:','.join(map(str,x))
@KhalilAlHooti这应该有效:
df['new_col']=df['col'].dropna().apply(lambda x:','.join(map(str,x)))
这会过滤掉空值,但在创建新列时会重新分配它们(因为pandas进行基于索引的赋值,缺少的值会被赋值为nan)。当我尝试此操作时,它在字母级而不是单词级执行。lambda函数没有这个问题吗?这意味着您的列是字符串而不是列表。您可以使用
ast.literal\u eval
将其转换回。尽管在这种情况下,只需执行
df['col'].str.replace('[\[,\]','')
有趣的方法会更快。但是,我为您的方法计时,它比
apply
慢了5倍。@IanS您是如何计时的?我认为这个答案中所示的矢量化字符串操作将比apply@Shoof我在IPython中使用了
%timeit
魔术。我再次检查,发现有100行的列速度慢了3倍。两种可能的解释:1)正则表达式替换操作,即使矢量化,也可能非常慢。2) 应用是智能的,例如,如果应用标准函数,例如
sum
,它将非常快。我假设我编辑了答案来添加计时的
join
@Shoof@IanS也会发生类似的事情。并使用
str.join
添加新方法,该方法位于
之后的第二位。apply(','.join)
@IanS非常感谢计时结果!这确实有点令人惊讶,因为有些书提出了相反的观点。很高兴看到这些比较!