在空数据帧上进行Groupby-Transform引发异常

时间:2018-07-09 20:10:11

标签: python pandas dataframe pandas-groupby

以下代码为何引发异常:

# 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来自应用程序的其他部分,因此可以为空。我正在使用Pandas 0.20.3。

1 个答案:

答案 0 :(得分:1)

pandas.groupby.transform调用core/reshape/concat.py文档解释了concat仅接收None对象的情况。

  

任何对象都不会被静默删除,除非           它们都为None,在这种情况下将引发ValueError

但是,具有apply或内置函数的普通groupby似乎没有此问题。如果您不想每次都检查此空条件,则可以使用.groupby().sum()的结果映射分组列,以完成与transform相同的操作。

第一种情况:

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