[英]Multiply each value in DataFrame cell according to multi-index name
鑒於此 pandas Dataframe
list_index = pd.Series(['A' for i in range(2)] + ['B' for i in range(4)] + ['C' for i in range(3)] + ['D' for i in range(6)], name='indexes')
list_type = pd.Series(['a', 'c'] + ['a', 'b','c','d'] + ['f','g','i'] + ['a','c','d','e','f','g'], name='types')
df = pd.DataFrame({
'value' : [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
}, index=[list_index, list_type])
indexes types value
A a 1
c 2
B a 3
b 4
c 5
d 6
C f 7
g 8
i 9
D a 10
c 11
d 12
e 13
f 14
g 15
我想將每個值乘以另一個 pandas.Dataframe 中包含的一個因子(又名比率)
ratio_df = pd.DataFrame({
'ratio' : [0.1, 0.2, 0.4, 0.5]
}, index=['A', 'B', 'C', 'D'])
ratio
A 0.1
B 0.2
C 0.4
D 0.5
因此df
中所有帶有 'indexes' == 'A' 的值都乘以 0.1,而帶有 'indexes' == 'B' 的值乘以 0.2 等等。
我確信有一些聰明的方法可以做到這一點,但現在我真的想不出。 我知道我可以將 ratio_df “擴展”到與 df 相同的長度(使用 reset_index() 然后為 df 創建一個包含比率的新列)而不是簡單地成對執行*
操作,但我不確定這是最快的方法。
我也看過這個答案,但它與我的情況略有不同。
如果只需要兩列Series.mul的乘積,可以根據索引級別對齊。
只有 select 列和索引級別的mul
:
df['value'].mul(ratio_df['ratio'], level='indexes')
或使用索引級別編號:
df['value'].mul(ratio_df['ratio'], level=0)
結果是一個未命名的系列:
indexes types
A a 0.1
c 0.2
B a 0.6
b 0.8
c 1.0
d 1.2
C f 2.8
g 3.2
i 3.6
D a 5.0
c 5.5
d 6.0
e 6.5
f 7.0
g 7.5
dtype: float64
生成的 Series 可以根據需要分配回df
:
df['new'] = df['value'].mul(ratio_df['ratio'], level='indexes')
df
:
value new
indexes types
A a 1 0.1
c 2 0.2
B a 3 0.6
b 4 0.8
c 5 1.0
d 6 1.2
C f 7 2.8
g 8 3.2
i 9 3.6
D a 10 5.0
c 11 5.5
d 12 6.0
e 13 6.5
f 14 7.0
g 15 7.5
將ratio
列重命名為value
,然后在level=0
上使用mul
:
df.mul(ratio_df.rename(columns={'ratio': 'value'}), level=0)
結果
value
indexes types
A a 0.1
c 0.2
B a 0.6
b 0.8
c 1.0
d 1.2
C f 2.8
g 3.2
i 3.6
D a 5.0
c 5.5
d 6.0
e 6.5
f 7.0
g 7.5
這是僅重置第一級的一種方法; join
; multiply
ing 和set_index
回到原來的:
out = df.reset_index(level=1).join(ratio_df).assign(New=lambda x: x['value']*x['ratio']).set_index('types', append=True)
Output:
value ratio New
types
A a 1 0.1 0.1
c 2 0.1 0.2
B a 3 0.2 0.6
b 4 0.2 0.8
c 5 0.2 1.0
d 6 0.2 1.2
C f 7 0.4 2.8
g 8 0.4 3.2
i 9 0.4 3.6
D a 10 0.5 5.0
c 11 0.5 5.5
d 12 0.5 6.0
e 13 0.5 6.5
f 14 0.5 7.0
g 15 0.5 7.5
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.