带有列的公式和变量号的Python数据框分组方式

时间:2019-07-25 23:31:42

标签: python formula pandas-groupby

我需要创建一个具有可变列数且已计算字段的分组数据框。

甚至不知道如何描述,所以我附了一张小桌子。 总有四组列,第五列包含一个公式,用于对前面的其他四列进行计算。

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

问题是,假设我将具有多组列和多个分组条件,该怎么做。

table

1 个答案:

答案 0 :(得分:1)

由于您尚未以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

然后,为每个集合计算并附加第五列(此处为“ 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