2016-11-18 79 views
1

我有一个多索引数据帧为:把条件放在熊猫数据框中(多索引)?

df = 
    sta1     sta2   ...    stan 
    coef e  p  coef e  p  ... coef e p 
t 3  0.1 0.001 2  0.1 0.001    1 0.1 0.01 
u 3  0.2 0.01  3  0.01 0.01    2 0.1 0.001 
v 2  0.1 0.001 4  0.1 0.1    2 0.001 0.001 

我希望把条件如果p> 0.01然后COEF =南。我的结果看起来像:

df = 
    sta1     sta2   ...    stan 
    coef e  p  coef  e  p  ... coef e p 
t 3  0.1 0.001 nan  0.1 0.1    1 0.1 0.01 
u 3  0.2 0.01  3  0.01 0.01    nan 0.1 0.1 
v 2  0.1 0.001 nan  0.1 0.1    2 0.001 0.001 

我明白,如果有人指导我。谢谢。

回答

1

我测试了我的随机数据,请告诉我它是否适合你的例子:

for multindex in df.columns.values: 
    if multindex[1] == 'p': 
     df[(multindex[0], 'coef')] = np.where(df[multindex] > 0.01, np.nan, df[(multindex[0], 'coef')]) 
+0

是的,它的工作原理。谢谢! – zhr

1

试试这个:

假设你有以下DF:

In [117]: df 
Out[117]: 
    stat1    stat2    stat3 
    coef e  p coef  e  p coef  e  p 
0 
t  3 0.1 0.001  2 0.10 0.001  1 0.100 0.010 
u  3 0.2 0.010  3 0.01 0.010  2 0.100 0.001 
v  2 0.1 0.001  4 0.10 0.100  2 0.001 0.001 

可以使用pd.IndexSlice[...]方法和@jezrael's idea of renaming column names in the mask

In [118]: mask = df.loc[:, idx[:, ['p']]] > 0.01 

In [119]: mask 
Out[119]: 
    stat1 stat2 stat3 
     p  p  p 
0 
t False False False 
u False False False 
v False True False 

In [120]: df[mask.rename(columns={'p':'coef'})] = np.nan 

In [121]: df 
Out[121]: 
    stat1    stat2    stat3 
    coef e  p coef  e  p coef  e  p 
0 
t  3 0.1 0.001 2.0 0.10 0.001  1 0.100 0.010 
u  3 0.2 0.010 3.0 0.01 0.010  2 0.100 0.001 
v  2 0.1 0.001 NaN 0.10 0.100  2 0.001 0.001 

说明:

In [123]: mask 
Out[123]: 
    stat1 stat2 stat3 
     p  p  p 
0 
t False False False 
u False False False 
v False True False 

In [124]: mask.rename(columns={'p':'coef'}) 
Out[124]: 
    stat1 stat2 stat3 
    coef coef coef 
0 
t False False False 
u False False False 
v False True False 
+0

很好的解决方案,也许'OP'想'<0.01' – jezrael

+0

@jezrael,谢谢!我刚刚意识到OP想改变'coef'而不是'p' - 我要纠正我的答案... – MaxU

+0

我开始解决这个问题,但它现在是你的;)也许可以帮助重命名'p'到' (我不确定) – jezrael