python - 空数据帧上的 Groupby-Transform 引发异常
问题描述
为什么下面的代码会引发异常:
# creates empty data frame with two columns
my_df = pd.DataFrame([], columns=["a", "b"])
# groups by the values in column "a" and transforms the values in "b" to be the sum
my_df.groupby("a")["b"].transform(lambda x: x.sum())
但是,这会导致此错误:
ValueError: No objects to concatenate
如果my_df
不为空,则有效:
list_of_numbers = [[0, 1],
[0, 2],
[1, 10]]
my_df = pd.DataFrame(list_of_numbers, columns=["a", "b"])
my_df.groupby("a")["b"].transform(lambda x: x.sum())
0 3
1 3
2 10
Name: b, dtype: int64
但my_df
来自应用程序的其他部分,因此它可以为空。我正在使用熊猫 0.20.3。
解决方案
pandas.groupby.transform调用core/reshape/concat.py文档解释了在 concat 仅接收 None 对象的情况下会发生什么。
任何 None 对象都将被静默删除,除非它们都是 None 在这种情况下将引发 ValueError
但是,普通groupby
的 apply 或内置函数似乎没有这个问题。如果您不想每次都检查此空条件,则可以改为将分组列与结果映射,.groupby().sum()
以完成与在这种情况下转换相同的事情。
第一种情况:
my_df = pd.DataFrame([], columns=["a", "b"])
my_df.a.map(my_df.groupby("a")["b"].sum())
#Series([], Name: a, dtype: float64)
第二种情况:
list_of_numbers = [[0, 1], [0, 2], [1, 10]]
my_df = pd.DataFrame(list_of_numbers, columns=["a", "b"])
my_df.a.map(my_df.groupby("a")["b"].sum())
#0 3
#1 3
#2 10
#Name: a, dtype: int64
唯一改变的是Name
结果系列的。
推荐阅读
- vue.js - 将 Vuetify 添加到单个 .vue 组件
- javascript - 单击按钮时Divs不在正确的位置
- json - SQLite 中的 JSON 函数
- mongodb - Mongoose 从数组中返回一个对象
- python - 是否可以在不首先使用 GitPython(或更一般的 Git)克隆存储库的情况下检索当前 HEAD 的提交 ID?
- laravel - 如何让用户订阅计划?
- python - AttributeError:“NoneType”对象没有属性“解码”
- flutter - 未找到“未找到 X Android SDK 文件:C:\Users\smart\AppData\Local\Android\Sdk\platforms\android-30\android.jar。”
- java - 通过 checkstyle-suppressions.xml 抑制 Google Checkstyle 警告
- c# - 在 Entity Framework Core 的 Linq 查询中使用本地函数