我需要创建一个具有可变列数且已计算字段的分组数据框。
甚至不知道如何描述,所以我附了一张小桌子。 总有四组列,第五列包含一个公式,用于对前面的其他四列进行计算。
问题是我需要对结果进行分组,并且应该根据各个列的总和来计算公式。
问题是,假设我将具有多组列和多个分组条件,该怎么做。
答案 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