我有类似的东西
df = pd.DataFrame(np.random.randint(2, 10, size = (5, 2)))
df.index = pd.MultiIndex.from_tuples([(1, 'A'), (2, 'A'), (4, 'B'),
(5, 'B'), (8, 'B')])
df.index.names = ['foo', 'bar']
df.columns = ['count1', 'count2']
df
给出:
count1 count2
foo bar
1 A 6 7
2 A 2 9
4 B 6 7
5 B 4 6
8 B 5 6
我还有一个总数列表 - 从其他地方获得 - 通过相同的'foo'索引:
totals = pd.DataFrame([2., 1., 1., 1., 10.])
totals.index = [1, 2, 4, 5, 8]
totals.index.names = ['foo']
totals
给出:
0
foo
1 2
2 1
4 1
5 1
8 10
如何将 df ( count1 和 count2 )的所有列除以总计中的foo编号? (因此,我需要通过'foo'数字匹配)
我检查了this question,看起来它应该可以解决问题,但我无法理解。
我试过
df.div(totals, axis = 0)
并更改 div 中的级选项,但没有成功。
一如既往,非常感谢你的时间
答案 0 :(得分:4)
尝试:
df.div(totals[0],axis='index',level='foo')
count1 count2
foo bar
1 A 1.0 4.5
2 A 4.0 8.0
4 B 5.0 9.0
5 B 5.0 5.0
8 B 0.9 0.5
也:
totals = pd.DataFrame([2., 1., 1., 1., 10.])
totals.index = [[1, 2, 4, 5, 8],['A', 'A', 'B', 'A', 'B']]
totals.index.names = ['foo','bar']
totals
0
foo bar
1 A 2.0
2 A 1.0
4 B 1.0
5 A 1.0
8 B 10.0
df[['count1','count2']].div(totals[0],axis='index')
count1 count2
foo bar
1 A 1.0 4.5
2 A 4.0 8.0
4 B 5.0 9.0
5 A NaN NaN
B NaN NaN
8 B 0.9 0.5
答案 1 :(得分:3)
使用values
中的totals[0]
列表:
df.div(totals[0].values, axis=0)
但它不会考虑来自totals
的索引。不知道为什么这不起作用:
df.div(totals[0], level=0, axis=0)