应用功能仅适用于一列,而不适用于多列?

时间:2018-11-25 21:44:50

标签: python python-3.x apply data-manipulation

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

为什么会这样?为什么只允许一列而不是多列?

1 个答案:

答案 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]

还有其他人。