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

Python 当单元格包含列表时,将应用熊猫,python,pandas,pandas-apply,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 我想对列的每个元素应用一些转换,例

我有一个
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
我想对
列的每个元素应用一些转换,例如:

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) 如何正确地将一些转换应用于
数据帧中的列表?

首先,我认为在pandas中使用
列表
是不正确的

但是如果真的需要它,请尝试升级pandas,因为对我来说,它在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

我无法复制这一点,df2似乎向我列出了正常的0[1,无]8 1[5]9列。您希望输出什么?我得到了df2和df的相同格式。对于df2顶行,我使用您的代码获得了
[1,无,3]
?谢谢!我有
pandas
版本
0.22.0
,升级解决了问题