【问题标题】:pandas apply when cells contain lists当单元格包含列表时,熊猫适用
【发布时间】:2019-03-06 13:53:25
【问题描述】:

我有一个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 中的列表?

【问题讨论】:

  • 我无法重现这个,df2 在我看来是col_lists col_normal 0 [1, None] 8 1 [5] 9
  • 你想要的输出是什么?我得到了 df2 和 df 相同的格式。对于 df2 顶行,我使用您的代码得到[1, None, 3]

标签: python pandas pandas-apply


【解决方案1】:

首先我认为在 pandas 中使用 lists 不是 good idea

但如果真的需要它,请尝试升级 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

【讨论】:

  • 谢谢!我有pandas版本0.22.0,升级它解决了问题
猜你喜欢
  • 1970-01-01
  • 2016-05-17
  • 2020-09-02
  • 2022-10-04
  • 2018-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-24
相关资源
最近更新 更多