python dataframe group by,包含公式和可变列数
我需要创建一个分组数据框,其中列数可变,并且有计算字段 甚至不知道该如何描述,所以我做了一张小桌子。 始终有四组列,第五列包含一个公式,用于对前面的其他四列进行计算 问题是我需要对结果进行分组,公式应该根据各个列的总和进行计算 问题是如何假设我将有多组列和多个分组标准python dataframe group by,包含公式和可变列数,python,formula,pandas-groupby,Python,Formula,Pandas Groupby,我需要创建一个分组数据框,其中列数可变,并且有计算字段 甚至不知道该如何描述,所以我做了一张小桌子。 始终有四组列,第五列包含一个公式,用于对前面的其他四列进行计算 问题是我需要对结果进行分组,公式应该根据各个列的总和进行计算 问题是如何假设我将有多组列和多个分组标准 由于您没有以数据帧格式提供数据,我对其结构做了一些假设。首先,创建一些具有代表性的数据 import pandas as pd from itertools import product setdata = [[12, 4, 0
由于您没有以数据帧格式提供数据,我对其结构做了一些假设。首先,创建一些具有代表性的数据
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
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
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
然后,您希望按年龄和性别进行聚合
df_grp = df_sets.groupby(['Age', 'Gender']).sum()
print(df_grp)
输出:
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
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
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
然后,为每个集合计算并附加第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)
输出:
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
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
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
我看你在这方面相对缺乏经验,所以,欢迎!通常对于此类问题(即标记为
pandas
),社区希望看到数据帧格式的数据。特别是关于你的问题——在分组示例中,你有一个年龄=3,性别=1的组,但它省略了原始数据的第6行。那是笔误吗?还不清楚您是想先创建第5列,然后再聚合,还是相反。这些结果并不相同。