首页 > 解决方案 > 空数据帧上的 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。

标签: pythonpandasdataframepandas-groupby

解决方案


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结果系列的。


推荐阅读