如何应用到具有多索引列的数据框中的一组列

时间:2019-04-06 12:03:37

标签: python pandas multiple-columns add multi-index

我有一个带有多索引列的数据框,如下所示,我要为每个用户以及m1和m2做的事,我需要获取今天的值+昨天的0.25 *值。 / p>

               m1              m2  
day           yesterday today yesterday today
user                                      
id1           5         6     7         8
id2           3         4     9         10

我尝试了以下操作,但是在所有“今天”列中都获得了NA值:

df.iloc[:, df.columns.get_level_values(1)=='today'] = 
df.iloc[:, df.columns.get_level_values(1)=='yesterday'] *0.25 +
 df.iloc[:, df.columns.get_level_values(1)=='today']

我在其他stackoverflow帖子上的搜索使我找到了按级别= 0进行分组的可能答案,但是我不知道如何从那里进行分组以及如何将函数应用于分组依据。 也许这不是解决此问题的正确方法?

df.groupby(level=0, axis=1).apply(...)

首先,我需要了解的是:

               m1                      m2  
day           yesterday today          yesterday today
user                                      
id1               5     6+0.25*5       7         8+0.25*7
id2               3     4+0.25*3       9         10+0.25*9

最终,我需要到达:


user           m1              m2             
id1            6+0.25*5        8+0.25*7
id2            4+0.25*3        10+0.25*9

p.s。这是我第一次在StackOverflow上提问,我已经尽力了!但请告诉我是否需要修改我的问题以遵循准则。谢谢!

2 个答案:

答案 0 :(得分:1)

使用DataFrame.xs进行选择,因此可以将DataFrame与多个常量一起添加。

该功能的优势已从最高级别(默认值drop_level=True)中删除-因此在输出MultiIndex中不使用任何DataFrame

print (df.xs('today', axis=1, level=1))
     m1  m2
id1   6   8
id2   4  10

print (df.xs('yesterday', axis=1, level=1))
     m1  m2
id1   5   7
id2   3   9

df1 = df.xs('today', axis=1, level=1) + 0.25 *df.xs('yesterday', axis=1, level=1)
print (df1)
       m1     m2
id1  7.25   9.75
id2  4.75  12.25

答案 1 :(得分:0)

找到了!!

def func(df):
    df.columns = df.columns.droplevel()
    return(df['today']+0.25*df['yesterday'])

然后:

df.groupby(level=0, axis=1).apply(func)