这可能是一个由两部分组成的问题,但我正在寻找对由二级索引标识的记录子集重新缩放(或执行任何操作)的最佳方法。
例如-假设我有以下数据帧:

>>> df=pd.DataFrame(data=[[1,2,3],[.4,.5,.6],[7,8,9],[.10,.11,.12]], index=pd.MultiIndex.from_tuples([(1,'a'), (1,'b'), (2,'a'), (2,'b')]), columns=['Var1','Var2','Var3'])
>>> df.index.names=['Number','Letter']
>>> print df
               Var1  Var2  Var3
Number Letter
1      a        1.0  2.00  3.00
       b        0.4  0.50  0.60
2      a        7.0  8.00  9.00
       b        0.1  0.11  0.12

我希望用字母“b”标识的两个记录将所有3个变量乘以10。
我正在努力解决的第一个问题是如何选择多索引的第二个索引。我可以通过以下草率的工作来做到这一点,但我想有一个更干净的方法:
>>> df=df.reset_index().set_index(['Letter','Number'])
>>> Records=df.loc['b']
>>> print Records
        Var1  Var2  Var3
Number
1        0.4  0.50  0.60
2        0.1  0.11  0.12

关于如何更好地在第二个索引上子集,有什么建议吗?
然后我可以重新缩放它们:
>>> print Records*10
        Var1  Var2  Var3
Number
1          4     5     6
2         10    11    12

但是,如何将原始值替换为那些新重新缩放的值?

最佳答案

使用pandas,可以使用以下任一选项访问多索引中的第二级:

df.loc[df.index.isin("b", level="Letter")]
               Var1  Var2  Var3
Number Letter
1      b        0.4  0.50  0.60
2      b        0.1  0.11  0.12


df.xs("b", level="Letter")
        Var1  Var2  Var3
Number
1        0.4  0.50  0.60
2        0.1  0.11  0.12

它不是完全相同的输出,只有第一个版本允许您更改值(感谢loc和保留所有索引值的事实):
df.loc[df.index.isin("b", level="Letter")] = df.loc[df.index.isin("b", level="Letter")]*10

df
               Var1  Var2  Var3
Number Letter
1      a          1   2.0   3.0
       b          4   5.0   6.0
2      a          7   8.0   9.0
       b          1   1.1   1.2

这样,您还可以方便地访问给定的列,您还可以修改该列:
df.loc[df.index.isin("b", level="Letter"), "Var3"] = "Foo"
df

               Var1  Var2 Var3
Number Letter
1      a          1   2.0    3
       b          4   5.0  Foo
2      a          7   8.0    9
       b          1   1.1  Foo

希望这有帮助

09-10 03:03
查看更多