python - 在 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') 方法,如下面的问题所示。
将问题编辑为关于导致行为变化的熊猫变化。
解决方案
您可以使用.transform
with GroupBy.first
,如下所示:
df.groupby(["group"])["balance_status"].transform('first')
结果:
0 Status One
1 Status One
2 None
3 None
Name: balance_status, dtype: object
推荐阅读
- ruby - Ruby 中这个时间转换代码的错误是什么?
- asp.net - 所有控制器的通用索引操作
- r - Rscript - 使用相同的 R 文件,R 终端的行为与 Rstudio 不同
- python-3.x - 功能和故事图 || 对 keras 政策的投入
- javascript - 添加输入时数据库未响应表单
- wordpress - 如何在类别中制作类别中的类别
- javascript - 如何使用 Vuejs 访问 mapAction 方法?
- javascript - 不知道为什么这个函数返回一个反向数组
- json - 使用 JSON-API 获取的字符串将在 Swift 中从 base64 转换为 UTF8
- assembly - 将单词的每个字符替换为该单词中的大写字符数