gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 03:27:49 24 4
gpt4 key购买 nike

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

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

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

最佳答案

代码

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,我们将条件和所需的输出放在选择中。

关于python - 如何对多列进行分组并对最后一列求和?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67311140/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com