在较低级别的MultiIndex DataFrame中更改多个值

时间:2019-03-19 07:56:16

标签: python pandas dataframe indexing

考虑以下DataFrame:

flutter run

说我想用以下值缩放df:

import numpy as np
import pandas as pd

arrays = [['foo', 'foo', 'foo', 'bar', 'bar', 'bar'],
      ['A', 'B', 'C', 'A', 'B', 'C']]
tuples = list(zip(*arrays))
index_values = pd.MultiIndex.from_tuples(tuples)
df = pd.DataFrame(np.random.rand(6), index = index_values)

print(df)

              0
foo A  0.726699
    B  0.001700
    C  0.936495
bar A  0.298490
    B  0.167234
    C  0.476725

也就是说,我希望所有A都乘以0,所有B都乘以1,所有C都乘以4。

当前,我使用以下方法:

df_scale = pd.DataFrame([0,1,4], index=['A','B','C'])
print(df_scale)

   0
A  0
B  1
C  4

虽然这行得通,但我不禁认为熊猫内有一项功能可以使我做到这一点。

我在Select rows in pandas MultiIndex DataFrame上找到了答案。

起初我以为我可以使用df.xs(),但是如果我理解正确,那只会允许我选择而不更改值。

接下来,我研究了pd.IndexSlice(),但看不到如何使用它来更改多个值。

熊猫是否提供在MultiIndex DataFrame的较低级别中更改多个值的功能?

1 个答案:

答案 0 :(得分:1)

您可以乘以DataFrame.mul

df = df.mul(df_scale, level=1, axis=0)
#if want multiple by column 0
#df = df.mul(df_scale[0], level=1, axis=0)
print (df)
              0
foo A  0.000000
    B  0.393081
    C  2.495880
bar A  0.000000
    B  0.880499
    C  1.196688