以下代码为何引发异常:
# 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。
答案 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
。