python - 如何应用于具有多索引列的数据框中的一组列
问题描述
我有一个带有多索引列的数据框,如下所示,我要做的是针对每个用户以及 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']
我对其他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
ps 这是我第一次在 StackOverflow 上提问,我尽力了!但如果我需要修改我的问题以遵循指南,请告诉我。谢谢!
解决方案
用于DataFrame.xs
选择,因此可以将DataFrame
s 与多个常量相加。
功能的优势是移除了顶层(默认值drop_level=True
) - 所以使用 no MultiIndex
in output DataFrame
s。
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
推荐阅读
- python - Python 从 6 个字符的 random.shuffle 列表中选择一组固定的 4 个字符
- javascript - 如何将映射数据返回到 DOM
- javascript - 如何使用 @url.Action 使用 ajax 传递带值的参数
- c - 为什么屏幕每秒重置一次?
- java - NullPointerException LinkedList 反向方法
- python - wfastcgi-enable 创建进程失败
- python - Python TypeError:“str”和“int”的实例之间不支持“>”
- unity3d - Unity shader graph 10.5.1 - 纹理2D大问题
- css - 如果 Shopify 产品页面中出现换行符,如何缩小字体大小?
- r - 从栅格中提取一些值作为矩阵,进行转换并将转换后的值放到其原始位置