在pandas中将字符串列转换为列表

24

我的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',')']

有没有想法如何能够做到呢?

谢谢。

5个回答

34

使用str.stripstr.split函数:

df['LABELS'] = df['LABELS'].str.strip('()').str.split(',')

但是,如果这里没有NaN列表推导式也可以很好地工作:

df['LABELS'] = [x.strip('()').split(',') for x in df['LABELS']]

2
我会说这是三个方案中最快的解决方案 :-) - BENY
这会产生警告:<input>:1:SettingWithCopyWarning: 正在尝试在DataFrame的切片副本上设置值。请尝试使用.loc [row_indexer,col_indexer] = value。 - random
问题在上面的代码中,有一些过滤吗?比如 df = df[df['col'] > 10]?那么需要使用 df = df[df['col'] > 10].copy() 来避免警告。 - jezrael
如果您的参数已经是列表形式的字符串,请将 () 转换为 [] - Mr. Panda

33

你可以使用 ast.literal_eval,它会给你一个元组:

import ast
df.LABELS = df.LABELS.apply(ast.literal_eval)

如果你确实需要一个列表,请使用:

df.LABELS.apply(lambda s: list(ast.literal_eval(s)))

3

对不起,我来晚了。所以给其他来晚的人提供以下解决方案,基于上面的回答:

df['hashtags'] = df.apply(lambda row:  row['hashtags'].strip('[]').replace('"', '').replace(' ', '').split(',')   , axis=1)

我加载了一个 csv 文件,其中一些列看起来像这样 ...,['hashtag1','hashtag2'],... ,Panda DataFrame 把它加载成了字符串对象。我使用了上面的代码将其转换为列表。然后我使用 "explode" 函数展开数据。

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]

1

或者,您可以考虑使用正则表达式:

pattern = re.compile("[0-9]\.[0-9]")
df.LABELS.apply(pattern.findall)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接