首页 > 解决方案 > 在 0.25 到 1.3 版本之间使用 any() 更改 Pandas 变换函数

问题描述

我正在升级旧应用程序中的 pandas,并注意到使用 any() 方法的版本之间转换函数的工作方式发生了变化。

从下面的数据框开始,

df = pd.DataFrame({
            "group": ["EA", "EA", "WA", "WA"], 
            "unit_type": ["Weight", "Weight", "Weight", "Weight"], 
            "balance_status": ["Status One", None, None, None]
     })

group  ... balance_status
0    EA  ...       Status One
1    EA  ...           None
2    WA  ...           None
3    WA  ...           None

我在新的 df 上执行 groupby(),检查组中是否有任何项目具有状态,然后将组中所有行的状态设置为唯一状态。以下命令。

calculated["balance_status"] = df.groupby(["group"])["balance_status"]\
                                 .transform(lambda x: x.any() if x.any() else None)

熊猫版本 0.25.3

版本 0.25.3 中的原始形式将状态作为字符串给出,这是所需的。

  group  ... balance_status
0    EA  ...            Status One
1    EA  ...            Status One
2    WA  ...            NaN
3    WA  ...            NaN

熊猫版本 1.3.4

升级 pandas 现在会提供以下输出。x.any() 命令现在只产生“True”,它被转换为整数。这符合我的预期。

  group  ... balance_status
0    EA  ...            1.0
1    EA  ...            1.0
2    WA  ...            NaN
3    WA  ...            NaN

解决方法

我的新版本制作了该系列的生成器并采用第一个非 NaN 值。这为我们产生了正确的结果。我们不在乎第一个值之后是否还有其他值。

calculated["balance_status"] = df.groupby(["group"])["balance_status"]\
  .transform(lambda x: next(item for item in x if item is not None) if x.any() else None)

问题

像这样使用时 any() 函数发生了什么变化(文档看起来相同)。

编辑

正如 SeaBean 所指出的,更类似于熊猫的解决方案是使用 groupby().transform('first') 方法,如下面的问题所示。

如何将 groupby.first() 与变换函数一起使用

将问题编辑为关于导致行为变化的熊猫变化。

标签: pythonpandas

解决方案


您可以使用.transformwith GroupBy.first,如下所示:

df.groupby(["group"])["balance_status"].transform('first')

结果:

0    Status One
1    Status One
2          None
3          None
Name: balance_status, dtype: object

推荐阅读