我有一个数据集df,我想在其中将其行转换为列标题,并创建一个运行总数:
数据
cons_power cons_count id date r_power r_count d_power d_count
500 20 aa q122 50 2 20 1
0 0 aa q222 20 1 0 0
1000 80 bb q122 0 0 50 3
0 0 bb q222 100 5 0 0
所需的
id q122_power q122_count q222_power q222_count
aa 530 21 550 22
bb 950 77 1050 82
逻辑
对于q122,id'aa'的w cons_功率值为500,我们加上r_功率值50,减去d_功率值20,得到的值为:530
然后,我们将530的值作为q222的下一个基线值,即加上r_幂,减去d_幂=550
计数使用相同的概念。(开始计算'aa'q122的20,加2减1)给我们:21的值
然后,我们将值21作为q222的下一个基线值,即加上r_计数,减去d_计数=22
做
df['q122_power'] = df['r_power'].add(df.groupby('id', 'date')
['r_power'].cumsum()).sub(df.groupby('id', 'date')['d_power'].cumsum())
df['q222_power'] = df['r_power'].add(df.groupby('id', 'date')
['r_power'].cumsum()).sub(df.groupby('id', 'date')['d_power'].cumsum())
df['q122_count'] = df['r_count'].add(df.groupby('id', 'date')
['r_count'].cumsum()).sub(df.groupby('id', 'date')['d_count'].cumsum())
df['q222_count'] = df['r_count'].add(df.groupby('id', 'date')
['r_count'].cumsum()).sub(df.groupby('id', 'date')['d_count'].cumsum())
试图找到一种更优雅的方式来产生所需的输出。我已经能够解决分组和计算问题,但不确定如何将枢轴步骤合并到脚本中。如有任何建议,我们将不胜感激
修改
df
,使以d_
开头的任何列都具有负号:对
power
和count
进行筛选并聚合:计算
id
上的累积和并重新整形:我们还可以创建一个多索引,以允许使用顶级索引组
cons
、r
和d
进行计算:df
:工作原理:
^{} 然后使用^{} 创建多索引:
我们现在可以访问顶级索引并进行计算(索引对齐将确保计算发生在较低级别的索引
power
和count
)中):然后取^{} 得到每个
id
内的滚动总数:^{} 将索引级别转换为列级别的日期列:
现在剩下的就是用^{} 清理并折叠多索引:
和^{} 恢复默认范围索引:
设置和导入:
在
groupby
之前计算power
和count
,然后透视数据帧。最后平齐列多索引并重置行索引输出
相关问题 更多 >
编程相关推荐