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