我有一个PANDAS数据帧,其结构如下:
id,sex,age,rank,skill
1,M,9,1,A
1,M,8,2,G
1,M,10,3,F
2,F,10,3,M
2,F,8,4,W
2,F,6,4,O
3,M,5,1,Q
3,M,4,3,N
3,M,9,4,Y
对数据帧进行groupby / apply操作后我想要的输出是:
id,sex,age,rank,skill
1,M,8,1,A
2,F,6,3,M
3,M,4,1,Q
换句话说,我希望通过id字段进行分组,性别字段不会改变,年龄值的min(),等级值的min()以及min处出现的技能值( )等级值。
我知道多个agg函数可以传递给dict中的groupby,但它如何处理常量的值或者依赖于我不理解的另一个字段中的函数结果。
答案 0 :(得分:4)
在您预期的结果中,它是min
的{{1}},但在您的解释中,您提到它是rank
我的答案基于您的预期输出
max
答案 1 :(得分:1)
对于具有常量值的列,您有几个选项:first,last等。对于与最高(或示例中的最小值)等级值对应的技能值,您需要使用idxmin。要使idxmin起作用,技能应该是索引,因此第一步将其设置为索引。
df.set_index('skill').groupby('id').agg({'sex': 'first',
'age': 'min',
'rank': ['min', 'idxmin']})
Out:
sex age rank
first min min idxmin
id
1 M 8 1 A
2 F 6 3 M
3 M 4 1 Q
答案 2 :(得分:1)
+1的文字。
我有更多的步骤,但它是相同的想法,如果你不跟随,可能更容易阅读:
func = {'sex': 'min', 'age': 'min', 'rank': 'min'}
df_agg = df.groupby('id').agg(func)
df_agg = df_agg.reset_index()
df = df.drop('age', 1)
df = pd.merge(df_agg, df, on = ['id', 'sex', 'rank'])
设置要应用于每列的聚合。然后使用agg按ID分组。您需要在此时重置索引,否则您将无法在下一步中执行合并,因为id将被视为索引。
df仍然存储您的原始数据框。从df中删除年龄,因为您只需要最小化的年龄,存储在df_agg中。然后对您希望匹配的列执行合并:id,sex和rank。你正在合并等级以便为骑行提供正确的技能。