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

马修斯·苏亚雷斯

我有这个我一直试图解决的问题:

我希望代码采用这个 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'),但它没有显示上述所需的结果。

有没有大熊猫风格的方法来解决这个问题?提前致谢!

单位

代码

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 列分别。

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

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章