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')
所以我收到错误,但如果我只选出 1 列:
d['list1'].apply(lambda x: ast.literal_eval(x.strip()))
>> 0 [1, 6]
1 [1, 7]
Name: list1, dtype: object
为什么会发生这种情况?为什么它只允许一列而不是多列?
最佳答案
了解如何 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]
除其他外。
关于python - 应用函数仅适用于一列而不是多列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53472302/