当单元格包含列表时,将应用熊猫

时间:2018-10-01 12:39:48

标签: python pandas pandas-apply

我有一个DataFrame,其中一列包含列表作为单元格内容,如下所示:

import pandas as pd
df = pd.DataFrame({
    'col_lists': [[1, 2, 3], [5]],
    'col_normal': [8, 9]
})

>>> df
   col_lists  col_normal
0  [1, 2, 3]           8
1        [5]           9

我想对col_lists的每个元素进行一些转换,例如:

df['col_lists'] = df.apply(
    lambda row: [ None if (element % 2 == 0) else element for element in row['col_lists'] ], 
    axis=1
)

>>> df
      col_lists  col_normal
0  [1, None, 3]           8
1           [5]           9

使用此数据框,它可以按我预期的方式工作,但是,当我将相同的代码应用于其他数据框时,我得到一个奇怪的结果-对于每一行,该列仅包含列表的第一个元素:

df2 = pd.DataFrame({
    'col_lists': [[1, 2], [5]], # length of first list is smaller here
    'col_normal': [8, 9]
})

df2['col_lists'] = df2.apply(
    lambda row: [ None if (element % 2 == 0) else element for element in row['col_lists'] ], 
    axis=1
)

>>> df2
   col_lists  col_normal
0        1.0           8
1        5.0           9

我有两个问题:

(1)这是怎么回事?为什么在df而不是df2的情况下得到正确的结果?

(2)如何正确地对DataFrame中的列表应用某些转换?

1 个答案:

答案 0 :(得分:3)

首先,我认为在good idea中使用list大熊猫不是这样。

但是,如果确实需要,请尝试升级熊猫,因为对我来说,它在pandas 0.23.4中运行良好:

df2['col_lists'] = df2.apply(
    lambda row: [ None if (element % 2 == 0) else element for element in row['col_lists'] ], 
    axis=1
)

print (df2)
   col_lists  col_normal
0  [1, None]           8
1        [5]           9