将一列字符串转换为熊猫列表
Posted
技术标签:
【中文标题】将一列字符串转换为熊猫列表【英文标题】:Convert a columns of string to list in pandas 【发布时间】:2018-10-21 01:02:18 【问题描述】:我对 pandas 数据框中的一列的类型有疑问。基本上,该列作为字符串保存在 csv 文件中,我想将其用作元组以便能够将其转换为数字列表。下面是一个非常简单的csv:
ID,LABELS
1,"(1.0,2.0,2.0,3.0,3.0,1.0,4.0)"
2,"(1.0,2.0,2.0,3.0,3.0,1.0,4.0)"
如果使用函数“read_csv”加载它,我会得到一个字符串列表。我试图转换为列表,但我得到了字符串的列表版本:
df.LABELS.apply(lambda x: list(x))
返回:
['(','1','.','0',.,.,.,.,.,'4','.','0',')']
你知道怎么做吗?
谢谢。
【问题讨论】:
【参考方案1】:你可以试试这个(假设你的csv
被称为filename.csv
):
df = pd.read_csv('filename.csv')
df['LABELS'] = df.LABELS.apply(lambda x: x.strip('()').split(','))
>>> df
ID LABELS
0 1 [1.0, 2.0, 2.0, 3.0, 3.0, 1.0, 4.0]
1 2 [1.0, 2.0, 2.0, 3.0, 3.0, 1.0, 4.0]
【讨论】:
【参考方案2】:你可以使用ast.literal_eval
,它会给你一个元组:
import ast
df.LABELS = df.LABELS.apply(ast.literal_eval)
如果您确实想要一个列表,请使用:
df.LABELS.apply(lambda s: list(ast.literal_eval(s)))
【讨论】:
【参考方案3】:使用str.strip
和str.split
:
df['LABELS'] = df['LABELS'].str.strip('()').str.split(',')
但如果这里没有NaN
s,list comprehension
也可以正常工作:
df['LABELS'] = [x.strip('()').split(',') for x in df['LABELS']]
【讨论】:
我会说这是 3 中更快的解决方案 :-)【参考方案4】:或者,您可以考虑使用正则表达式:
pattern = re.compile("[0-9]\.[0-9]")
df.LABELS.apply(pattern.findall)
【讨论】:
【参考方案5】:对不起,我迟到了。因此,对于其他后来者,我根据上述回复完成了这项工作:
df['hashtags'] = df.apply(lambda row: row['hashtags'].strip('[]').replace('"', '').replace(' ', '').split(',') , axis=1)
我加载了一个 csv,其中包含一些看起来像这样的列 ...,['hashtag1','hashtag2'],... 并且 Panda DataFrame 将其作为字符串对象加载。我使用了上面的代码并将其转换为列表。然后我使用“explode”来展平数据。
【讨论】:
以上是关于将一列字符串转换为熊猫列表的主要内容,如果未能解决你的问题,请参考以下文章
有没有更快的方法将一列 pyspark 数据框转换为 python 列表? (Collect() 非常慢)