x = [{'list1':'[1,6]', 'list2':'[1,1]'},
{'list1':'[1,7]', 'list2':'[1,2]'}]
df = pd.DataFrame(x)
现在,我将其从字符串转换为列表类型:
df[['list1','list2']].apply(lambda x: ast.literal_eval(x.strip()))
>> ("'Series' object has no attribute 'strip'", 'occurred at index list1')
所以我得到一个错误,但是如果我只挑出一列:
d['list1'].apply(lambda x: ast.literal_eval(x.strip()))
>> 0 [1, 6]
1 [1, 7]
Name: list1, dtype: object
为什么会这样?为什么只允许一列而不是多列?
答案 0 :(得分:2)
了解apply
应该如何工作以了解为什么它对您不起作用很重要。每列(考虑默认的axis=0
)都经过反复操作,您可以通过让每个系列自行打印来查看操作方法:
df.apply(lambda x: print(x))
0 [1,6]
1 [1,7]
Name: list1, dtype: object
0 [1,1]
1 [1,2]
Name: list2, dtype: object
当您尝试致电(series_object).strip()
时,该错误更有意义。
由于您希望将函数分别应用于每个单元格,因此可以改为使用applymap
,相比之下,它相对更快。
df[['list1','list2']].applymap(ast.literal_eval)
或者,
df[['list1','list2']].applymap(pd.eval)
list1 list2
0 [1, 6] [1, 1]
1 [1, 7] [1, 2]
其他选项还包括:
df.apply(lambda x: x.map(ast.literal_eval))
list1 list2
0 [1, 6] [1, 1]
1 [1, 7] [1, 2]
还有其他人。