有一定的df:
Start End N Count Avg
1 abc1 10 2 .5
1 abc2 10 2 .5
1 xyz1 10 2 .5
1 xyz2 10 2 .5
1 ijk1 10 2 .5
2 abc1 12 3 .4
2 xyz1 12 1 .1
2 xyz2 12 1 .4
2 ijk1 12 6 .5
2 ijk2 12 1 .7
我的目标是将所有xyz ...分组为1组,将ijk分组为1组。然后将Count计算并取平均值。
Start End N Count Avg
1 abc1 10 2 .5
1 abc2 10 2 .5
1 xyz 10 4 .5
1 ijk 10 2 .5
2 abc1 12 3 .4
2 xyz 12 2 .25
2 ijk 12 7 .6
我试过df.groupby()。agg(sum)但我遇到了2个问题:
我不想将abc分组..只是ijk和xyz的任何内容
我想分别控制总和和平均值取决于字段的名称
有什么想法?非常感谢!
答案 0 :(得分:2)
您需要将列End的字符串部分分组并使用agg
df[df['End'].str.contains('ijk|xyz')]\
.groupby(['Start', df['End'].str.extract('([A-Za-z]+)', expand = False)])\
.agg({'Count': 'sum', 'Avg': 'mean'})
Count Avg
Start End
1 ijk 2 0.50
xyz 4 0.50
2 ijk 7 0.60
xyz 2 0.25
注意:如果只有一个需要排除的数字,您可以简化代码以从End列中提取字符串。像,
df[df['End'].str.contains('ijk|xyz')]\
.groupby(['Start', df['End'].str[:-1]])\
.agg({'Count': 'sum', 'Avg': 'mean'})
重置索引
df[df['End'].str.contains('ijk|xyz')]\
.groupby(['Start',df ['End']。str [: - 1]])\ .agg({'Count':'sum','Avg':'mean'})。reset_index()
Start End Count Avg
0 1 ijk 2 0.50
1 1 xyz 4 0.50
2 2 ijk 7 0.60
3 2 xyz 2 0.25