微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python – 子集Pandas DataFrame二级索引和重新分配值

这可能是一个两部分问题,但我正在寻找对其二级索引标识的记录子集进行重新缩放(或执行任何操作)的最佳方法.

例如 – 说我有以下数据框:

>>> 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,您可以使用以下任一方式访问MultiIndex中的第二级:

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

希望这可以帮助

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐