python - 计算每组多索引对象 pandas
问题描述
我想为 groupby 对象的每组计算一个值,但对组的每一行重复它。 尽管标题似乎是我需要的,但在 Pandas 数据框组中的计算不起作用。我看不出公式是否有问题。它应该是excel词汇表中的一种sumproduct。
dat = pd.DataFrame({'Supplier': ['A', 'A', 'A', 'B','B'], 'Id': ['1','2','3','4','5'], 'a': [2,2,2,2,2], 'AVG' :[5,6,7,8,3], 'BP': [3,4,5,6,3], 'Hc': [0.15,0.15,0.15,0.15,0.15]})
dat = dat.groupby(['Supplier', 'Id'])['a','AVG', 'BP','Hc'].sum()
for supplier in dat.index[0]:
dat['s'] = np.sqrt((2 * (dat['a'])/ (
((dat['AVG'] * dat['BP'] * (dat['Hc']/4)).sum()))))
我得到的结果是这样的:
a AVG BP Hc s
Supplier Id
A 1 2 5 3 0.15 0.902358
2 2 6 4 0.15 0.902358
3 2 7 5 0.15 0.902358
B 4 2 8 6 0.15 0.902358
5 2 3 3 0.15 0.902358
但我想得到类似的东西:
a AVG BP Hc s
Supplier Id
A 1 2 5 3 0.15 x
2 2 6 4 0.15 x
3 2 7 5 0.15 x
B 4 2 8 6 0.15 y
5 2 3 3 0.15 y
这里的 x 和 y 只是为了表明每个“组”的数字应该不同
解决方案
你可以试试这个:
groupby.apply
功能使您可以访问每个组(供应商)数据框。
def cal_func(df):
df['s'] = np.sqrt((2 * (df['a'])/ (
((df['AVG'] * df['BP'] * (df['Hc']/4)).sum()))))
return df
dat_new = dat.groupby(['Supplier']).apply(cal_func)
dat_new
Supplier Id a AVG BP Hc s
0 A 1 2 5 3 0.15 1.200600
1 A 2 2 6 4 0.15 1.200600
2 A 3 2 7 5 0.15 1.200600
3 B 4 2 8 6 0.15 1.367971
4 B 5 2 3 3 0.15 1.367971
推荐阅读
- python - 如何使用运算符作为在 for 循环中调用的变量来过滤熊猫数据框
- session - 带有 id_token_hint 的 oidc/logout 不起作用
- javascript - discord.js 我的代码不起作用,在终端中显示 typeError 但我不知道出了什么问题
- javascript - 如何导出要在另一个文件脚本中调用的函数
- android - 错误 android.content.ActivityNotFoundException:仅在极少数设备中
- laravel - 使用 LARAVEL AJAX 时无法从浏览器下载 PDF 格式的文件
- javascript - 让字体很棒的播放圈图标旋转几秒钟并加载一个模态
- statistics - 合理使用非线性回归模型
- node.js - express-session 动态 cookie 域
- node.js - 如何从 *.datasource.ts 创建数据库?