我有一个带有多索引列的数据框,如下所示,我要为每个用户以及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上提问,我已经尽力了!但请告诉我是否需要修改我的问题以遵循准则。谢谢!
答案 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)