python 数据框分组依据公式和列的可变数量

python dataframe group by with formulas and variable numbers of column

我需要创建一个包含可变列数的分组数据框,其中包含计算字段。

甚至不确定如何描述这个所以我附上了一个小 table。 总是有四组列,第五列包含一个对其他四列进行计算的公式。

问题是我需要对结果进行分组,公式应该根据各个列的总和来计算。

问题是如何假设我会有多组列和多个分组标准。

由于您没有提供 DataFrame 格式的数据,我对其结构做了一些假设。首先,创建一些有代表性的数据。

import pandas as pd
from itertools import product

setdata = [[12, 4, 0, 0, 12, 3, 1, 0],
           [12, 5, 0, 0, 12, 2, 1, 0],
           [12, 4, 0, 0, 12, 3, 1, 0],
           [ 6, 0, 0, 0,  6, 0, 0, 0],
           [ 7, 4, 0, 1,  7, 1, 0, 0],
           [ 7, 5, 0, 1,  7, 2, 1, 0],
           [ 7, 4, 0, 2,  7, 2, 0, 0]]

df_sets = pd.DataFrame(setdata)
level0 = ['Set{}'.format(i) for i in range(1, df_sets.shape[-1] // 4 + 1)]
level1 = ['A', 'B', 'C', 'D']
df_sets.columns = pd.MultiIndex.from_tuples(product(level0, level1))
df_sets.insert(0, 'Age', [3, 3, 3, 4, 3, 3, 6])
df_sets.insert(1, 'Gender', [1, 1, 1, 2, 2, 1, 1])
print(df_sets)

输出:

  Age Gender Set1          Set2         
                A  B  C  D    A  B  C  D
0   3      1   12  4  0  0   12  3  1  0
1   3      1   12  5  0  0   12  2  1  0
2   3      1   12  4  0  0   12  3  1  0
3   4      2    6  0  0  0    6  0  0  0
4   3      2    7  4  0  1    7  1  0  0
5   3      1    7  5  0  1    7  2  1  0
6   6      1    7  4  0  2    7  2  0  0

然后,您要按年龄和性别汇总。

df_grp = df_sets.groupby(['Age', 'Gender']).sum()
print(df_grp)

输出:

           Set1           Set2          
              A   B  C  D    A   B  C  D
Age Gender                              
3   1        43  18  0  1   43  10  4  0
    2         7   4  0  1    7   1  0  0
4   2         6   0  0  0    6   0  0  0
6   1         7   4  0  2    7   2  0  0

然后,为每个集合计算并附加第 5 列(此处为 "E"),并对列重新排序,以便每个 "E" 列与其对应的集合一起打印。

for idx, grp in df_grp.groupby(level=0, axis=1):
    df_grp[(idx, 'E')] = grp[idx][['B', 'C', 'D']].sum(axis=1) / grp[(idx, 'A')]
df_grp.sort_index(axis=1, inplace=True)
print(df_grp)

输出:

              A   B  C  D         E    A   B  C  D         E
Age Gender                                                  
3   1        43  18  0  1  0.441860   43  10  4  0  0.325581
    2         7   4  0  1  0.714286    7   1  0  0  0.142857
4   2         6   0  0  0  0.000000    6   0  0  0  0.000000
6   1         7   4  0  2  0.857143    7   2  0  0  0.285714