代码之家  ›  专栏  ›  技术社区  ›  d_frEak

具有装箱条件的dataframe groupby聚合计数函数

  •  1
  • d_frEak  · 技术社区  · 2 年前

    我有一个这样的数据帧

    df = pd.DataFrame({
    'A': [1,1,2,2,3,3,3],
    'B': [1,3,1,3,1,2,1],
    'C': [1,3,5,3,7,7,1]})
    
        A   B   C
    0   1   1   1
    1   1   3   3
    2   2   1   5
    3   2   3   3
    4   3   1   7
    5   3   2   7
    6   3   1   1
    

    我想用列a的groupby创建列B(count)的binning 例如B_bin1,其中B<3,B_bin2为其余(>=3),C_bin1为C<5和C_bin2表示其余

    从这个例子中,我想要的输出是这样的

        A   B_bin1  B_bin2  C_bin1  C_bin2
    0   1   1       1       2       0
    1   2   1       1       1       1
    2   3   3       0       1       2
    

    我发现了类似的问题 Pandas groupby with bin counts ,它正在为1个箱子工作

    bins = [0,2,10]
    temp_df=df.groupby(['A', pd.cut(df['B'], bins)])
    temp_df.size().unstack()
    B   (0, 2]  (2, 10]
    A       
    1   1       1
    2   1       1
    3   3       0
    

    但是当我尝试使用多个bin时,它不起作用(我的真实数据有很多binning组)

    bins = [0,2,10]
    bins2 = [0,4,10]
    temp_df=df.groupby(['A', pd.cut(df['B'], bins), pd.cut(df['C'], bins2)])
    temp_df.size().unstack()
            C   (0, 4]  (4, 10]
    A       B       
    1   (0, 2]  1       0
        (2, 10] 1       0
    2   (0, 2]  0       1
        (2, 10] 1       0
    3   (0, 2]  1       2
        (2, 10] 0       0
    

    我的解决方法是创建一个小的临时df,然后使用1个组1个组1个组1个组1个组将其装箱,最后将其合并

    我还尝试使用类似于此的聚合(可能也使用pd.namedagh),但我想知道这是否可行

    df.groupby('A').agg(
        b_count = ('B', 'count'),
        b_sum = ('B', 'sum')
        c_count = ('C', 'count'),
        c_sum = ('C', 'sum')
    )
    

    有人对此有其他想法吗?

    1 回复  |  直到 2 年前
        1
  •  1
  •   jezrael    2 年前

    因为你需要单独处理每个箱子 groupby+size+unstack crosstab 通过连接数据帧 concat :

    bins = [0,2,10]
    bins2 = [0,4,10]
    
    temp_df1=pd.crosstab(df['A'], pd.cut(df['B'], bins, labels=False)).add_prefix('B_')
    temp_df2=pd.crosstab(df['A'], pd.cut(df['C'], bins2, labels=False)).add_prefix('C_')
    
    df = pd.concat([temp_df1, temp_df2], axis=1).reset_index()
    print (df)
       A  B_0  B_1  C_0  C_1
    0  1    1    1    2    0
    1  2    1    1    1    1
    2  3    3    0    1    2