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

Posted

技术标签:

【中文标题】如何应用于具有多索引列的数据框中的一组列【英文标题】:How to apply to one set of columns in a dataframe with multi-index columns 【发布时间】:2019-08-28 03:41:46 【问题描述】:

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

               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']

我对其他 *** 帖子的搜索使我得到了按级别 = 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

附言这是我第一次在 *** 上提问,我尽力了!但如果我需要修改我的问题以遵循指南,请告诉我。谢谢!

【问题讨论】:

【参考方案1】:

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

功能的优势被移除顶层(默认值drop_level=True) - 所以在输出DataFrames 中没有MultiIndex

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

【讨论】:

【参考方案2】:

找到了!!!

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

然后:

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

【讨论】:

以上是关于如何应用于具有多索引列的数据框中的一组列的主要内容,如果未能解决你的问题,请参考以下文章

如何计算包含一组列中的值和 Pandas 数据框中另一列中的另一个值的行数?

基于多索引列数据框中的列范围进行切片

使熊猫具有多索引列的多个数据框并完全连接

具有多索引列的 Pandas groupby

如何按行将函数应用于 PySpark 数据帧的一组列?

如何编写 R 脚本来检查直线;即,对于任何给定的行,一组列中的所有值是不是具有相同的值