将值设置为多层次pandas数据帧的列

时间:2018-03-14 16:25:11

标签: python pandas

我有一个多层次的pandas数据框,如下所示。对于给定属性,attr(' rh',' T'' V')如何设置某些值(比如值> 0.5)对于pLevs的 整套 的NaN?我已经看到了如何设置特定列的答案(例如,df [' rh',50]),但还没有看到如何选择整个集合。

attr      rh                             T                             V  
pLev       50        75        100       50        75        100       50        75        100            
refIdx    
0       0.225026  0.013868  0.306472  0.144581  0.379578  0.760685  0.686463  0.476179  0.185635   
1       0.496020  0.956295  0.471268  0.492284  0.836456  0.852873  0.088977  0.090494  0.604290   
2       0.898723  0.733030  0.175646  0.841776  0.517127  0.685937  0.094648  0.857104  0.135651    
3       0.136525  0.443102  0.759630  0.148536  0.426558  0.731955  0.523390  0.965385  0.094153

为方便协助,我在此处包含了创建数据框的代码:

import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.random((4,9)))
df.columns = pd.MultiIndex.from_product([['rh','T','V'],[50,75,100]])
df.columns.names = ['attr', 'pLev']
df.index.name = 'refIdx'

2 个答案:

答案 0 :(得分:0)

符号有点令人讨厌,但您可以使用IndexSlice

df.loc[:,pd.IndexSlice['rh',:]]=np.nan

答案 1 :(得分:0)

如果您的“给定属性”为'rh',那么您可以使用以下内容获取横截面:

df_xs = df.xs('rh', level='attr', axis=1, drop_level=False)

然后您可以按如下方式更新原始df

df[df_xs > 0.5] = np.nan

这是有效的,因为drop_level=False已经.xs