我有这个我一直试图解决的问题:
我希望代码采用这个 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
说明
由于我们需要按每一列 'A'、'B' 或 'C' 进行分组,考虑哪一列具有最大重复数,因此首先我们检查最大重复数并将 groupby 输出存储在 ga、gb、gc 中以表示 A, B、C 列分别。
我们正在检查条件中哪个列的频率最大。
根据条件,我们正在应用 if else 条件的选择。
np.select 就像 if-elif-else,我们将条件和所需的输出放在选择中。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句