Python 根据索引匹配,有选择地使用df.div()仅分割某一列

Python 根据索引匹配,有选择地使用df.div()仅分割某一列,python,pandas,division,Python,Pandas,Division,我有两个数据帧,一个是每月总计,另一个包含我想要除以第一个的值,以获得每月百分比贡献 Data = pd.DataFrame(data={'ID':[1,2,3,1,2,3,1,2,3], 'Month':[1,1,1,2,2,2,3,3,3], 'Value':[40,30,30,60,70,70,150,60,90]}) Data['MonthlyTotal'] = Data.Gropub

我有两个数据帧,一个是每月总计,另一个包含我想要除以第一个的值,以获得每月百分比贡献

Data = pd.DataFrame(data={'ID':[1,2,3,1,2,3,1,2,3],
                          'Month':[1,1,1,2,2,2,3,3,3],
                          'Value':[40,30,30,60,70,70,150,60,90]})
Data['MonthlyTotal'] = Data.Gropuby('Month')['Value'].transform('sum')
Data['Contributions'] = Data['Value'] / Data['MonthlyTotal']
以下是一些数据帧示例:

MonthlyTotals = pd.DataFrame(data={'Month':[1,2,3],'Value':[100,200,300]})

Data = pd.DataFrame(data={'ID':[1,2,3,1,2,3,1,2,3],
                          'Month':[1,1,1,2,2,2,3,3,3],
                          'Value':[40,30,30,60,70,70,150,60,90]})
我使用的是
df.div()
,所以我像这样设置索引

MonthlyTotals.set_index('Month', inplace=True)
Data.set_index('Month', inplace=True)
然后我做除法

Contributions = Data.div(MonthlyTotals, axis='index')
生成的数据帧是我想要的,但是我看不到
值所涉及的
ID
,因为它不在
MonthlyTotals
帧中。如何使用
df.div()
,但仅在某些列上有选择地使用

下面是我正在寻找的结果的一个示例数据帧

result = pd.DataFrame(data={'ID':[1,2,3,1,2,3,1,2,3],'Value':[0.4,0.3,0.3,0.3,0.35,0.35,0.5,0.2,0.3]})

另外,如果您只想使用pandas,您可以使用
reindex
+
update

Data.update(Data['Value'].div(MonthlyTotals['Value'].reindex(Data.index),axis=0))
Data
       ID  Value
Month           
1       1   0.40
1       2   0.30
1       3   0.30
2       1   0.30
2       2   0.35
2       3   0.35
3       1   0.50
3       2   0.20
3       3   0.30

如果数据完整,您可能不需要每月汇总。您可以使用
transform
计算MonthlyTotal,然后计算供款

Data = pd.DataFrame(data={'ID':[1,2,3,1,2,3,1,2,3],
                          'Month':[1,1,1,2,2,2,3,3,3],
                          'Value':[40,30,30,60,70,70,150,60,90]})
Data['MonthlyTotal'] = Data.Gropuby('Month')['Value'].transform('sum')
Data['Contributions'] = Data['Value'] / Data['MonthlyTotal']
输出

   ID  Month  Value  MonthlyTotal  Contributions
0   1      1     40           100           0.40
1   2      1     30           100           0.30
2   3      1     30           100           0.30
3   1      2     60           200           0.30
4   2      2     70           200           0.35
5   3      2     70           200           0.35
6   1      3    150           300           0.50
7   2      3     60           300           0.20
8   3      3     90           300           0.30

在这里,您已将ID除以(?)。我要查找的是与值相关的ID。我用一个示例结果数据框更新了我的问题。这就是獾!