如何对多列进行分组并对最后一列求和?

时间:2021-04-29 04:42:20

标签: python pandas dataframe pandas-groupby

我一直在努力解决这个问题:

我希望代码采用这个 DataFrame 并根据最频繁的数字对多列进行分组,并对最后一列的值求和。例如:

df = pd.DataFrame({'A':[1000, 1000, 1000, 1000, 1000, 200, 200, 500, 500],
                   'B':[380, 380, 270, 270, 270, 45, 45, 45, 55],
                   'C':[380, 380, 270, 270, 270, 88, 88, 88, 88],
                   'D':[45, 32, 67, 89, 51, 90, 90, 90, 90]})

df

       A     B     C    D
0   1000   380   380   45
1   1000   380   380   32
2   1000   270   270   67
3   1000   270   270   89
4   1000   270   270   51
5    200    45    88   90
6    200    45    88   90
7    500    45    88   90
8    500    55    88   90

我希望代码显示以下结果:

       A     B     C    D
0   1000   380   380   284
1   1000   380   380   284
2   1000   270   270   284
3   1000   270   270   284
4   1000   270   270   284
5    200    45    88   360
6    200    45    88   360
7    500    45    88   360
8    500    55    88   360

请注意,第一行中出现频率最高的值是 1000,这样我将列 'A' 分组,因此我在列 'D' 上得到总和 284。但是,在最后一行中,出现频率最高的数字 88 不在“A”列中,而是在“C”列中。我试图通过对“C”列进行分组来对“D”列上的值求和并得到 360。我不确定我是否说清楚了。

我尝试使用函数 df['D'] = df.groupby(['A', 'B', 'C'])['D'].transform('sum'),但它没有显示上述所需的结果。

是否有任何熊猫风格的方法来解决这个问题?提前致谢!

1 个答案:

答案 0 :(得分:3)

代码

def get_count_sum(col, func):
    return df.groupby(col).D.transform(func)
    
ga = get_count_sum('A', 'count')
gb = get_count_sum('B', 'count')
gc = get_count_sum('C', 'count')


conditions = [
    ((ga > gb) & (ga > gc)),
    ((gb > ga) & (gb > gc)),
    ((gc > ga) & (gc > gb)),
]

choices = [get_count_sum('A', 'sum'), 
           get_count_sum('B', 'sum'),
           get_count_sum('C', 'sum')]

df['D'] = np.select(conditions, choices)
df

输出

    A       B   C   D
0   1000    380 380 284
1   1000    380 380 284
2   1000    270 270 284
3   1000    270 270 284
4   1000    270 270 284
5   200     45  88  360
6   200     45  88  360
7   500     45  88  360
8   500     55  88  360

说明

  1. 因为我们需要根据每一列'A'、'B'或'C'进行分组,考虑哪一列具有最大重复数,所以首先我们检查最大重复数并将groupby输出存储在ga中, gb, gc 分别代表 A,B,C col。

  2. 我们正在检查条件中哪个列的频率最大。

  3. 根据条件,我们正在应用 if else 条件的选择。

  4. np.select 就像 if-elif-else 一样,我们将条件和所需的输出放在选择中。