python - Groupby 在具有重叠组的列上
问题描述
继续我之前的问题。
这将产生一个 81 列并填充随机数的 dafatrame:
import pandas as pd
import itertools
import numpy as np
col = "A,B,C".split(',')
col1 = "1,2,3,4,5,6,7,8,9".split(',')
col2 = "E,F,G".split(',')
all_dims = [col, col1, col2]
all_keys = ['.'.join(i) for i in itertools.product(*all_dims)]
rng = pd.date_range(end=pd.Timestamp.today().date(), periods=12, freq='M')
df = pd.DataFrame(np.random.randint(0, 1000, size=(len(rng), len(all_keys))), columns=all_keys, index=rng)
具有这 81 个列名称的数据框:
['A.1.E', 'A.1.F', 'A.1.G', 'A.2.E', 'A.2.F', 'A.2.G', 'A.3.E', 'A.3.F', 'A.3.G', 'A.4.E',
'A.4.F', 'A.4.G', 'A.5.E', 'A.5.F', 'A.5.G', 'A.6.E','A.6.F', 'A.6.G', 'A.7.E', 'A.7.F',
'A.7.G', 'A.8.E', 'A.8.F', 'A.8.G', 'A.9.E', 'A.9.F', 'A.9.G', 'B.1.E', 'B.1.F', 'B.1.G',
'B.2.E', 'B.2.F', 'B.2.G', 'B.3.E', 'B.3.F', 'B.3.G', 'B.4.E', 'B.4.F', 'B.4.G', 'B.5.E',
'B.5.F', 'B.5.G', 'B.6.E', 'B.6.F', 'B.6.G', 'B.7.E', 'B.7.F', 'B.7.G', 'B.8.E', 'B.8.F',
'B.8.G', 'B.9.E', 'B.9.F', 'B.9.G', 'C.1.E', 'C.1.F', 'C.1.G', 'C.2.E', 'C.2.F', 'C.2.G',
'C.3.E', 'C.3.F', 'C.3.G', 'C.4.E', 'C.4.F', 'C.4.G', 'C.5.E', 'C.5.F', 'C.5.G', 'C.6.E',
'C.6.F', 'C.6.G', 'C.7.E', 'C.7.F', 'C.7.G', 'C.8.E', 'C.8.F', 'C.8.G', 'C.9.E', 'C.9.F','C.9.G']
使用我上一个问题的解决方案,我知道如何创建一个分组函数,例如,获取所有“A.*.E”列(中间有任何数字),将它们求和并生成一个名为“A.*.E”的命名输出列。总和。然后对 'A.*.F'、'A.*.G' 等执行相同的操作:
def grouper(col):
c = col.split('.')
return f'{c[0]}.SUM.{c[-1]}'
df.groupby(grouper, axis=1).sum()
我的问题是一个函数是否也可以以产生重叠组的方式编写?例如,是否可以制作一个为 ('A.1.E' + 'A.2.E') 生成 SUM1 和为 ('A.1.E' + 'A.3.E' 生成 SUM2 的分组器? ),因此“A.1.E”列将出现在两个总和中。
解决方案
这对于 groupby 是不可能的,因为任何给定的列只能在一个组中,而不是在多个组中。要解决这种情况,您可以修改我对上一个问题的第一个解决方案:
cols = sorted([(x[0],x[1]) for x in set([(x.split('.')[0], x.split('.')[-1]) for x in df.columns])])
for c0,c1 in cols:
for n in range(2,10):
df[f'{c0}.SUM{n}.{c1}'] = df.filter(regex = f'{c0}\.(1|{n})\.{c1}').sum(axis=1)
(根据您的示例,这将适用于列标题中的单个数字(1 到 9)。如果数字 > 9,则必须相应地修改正则表达式。)
推荐阅读
- azure - 如何使用新值更新 AzureGroupDeployment?
- mocha.js - 摩卡测试注销控制器抛出无效的用户名
- html - Theming Bootstrap(4) 在 SCSS 中使用 CSS Vars
- aws-glue - AWS Glue 空值作为字符串插入 RDS
- c++ - Cppcheck 忽略 -i 并在干净构建后检查所有文件
- dataframe - 在 PySpark 的同一 agg 中的另一列上使用 agg 中生成的列
- kotlin - 使用 mokito 的间谍时 lambda 中缺少数据
- excel - Excel - 单元格颜色更改时的刷新/运行功能
- node.js - 将 js 响应返回对象表示为字符串
- sql - R 使用 dbplyr 从 SQL Server 复制