簡體   English   中英

根據多索引名稱將DataFrame單元格中的每個值相乘

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM