代码之家  ›  专栏  ›  技术社区  ›  Derek 朕會功夫

空数据帧上的GroupBy转换引发异常

  •  2
  • Derek 朕會功夫  · 技术社区  · 6 年前

    以下代码为什么会引发异常:

    # 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
    

    但是 迈耶夫 来自应用程序的其他部分,因此它可以是空的。我用的是熊猫0.20.3。

    1 回复  |  直到 6 年前
        1
  •  1
  •   ALollz    6 年前

    pandas.groupby.transform 电话 core/reshape/concat.py 文档解释了在concat只接收无对象的情况下会发生什么。

    除非 它们都是无的,在这种情况下,将引发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 结果序列的。