首页 > 解决方案 > 在使用条件聚合进行分组时选择多个第 n 个值 - 熊猫

问题描述

我有一个四列的 pd.DataFrame

    df = pd.DataFrame({'id':[1,1,1,1,1,2,2,2,2] 
                      , 'A':['H','H','E','E','H','E','E','H','H']
                      , 'B':[4,5,2,7,6,1,3,1,0]
                      , 'C':['M','D','M','D','M','M','M','D','D']})

   id  A  B  C
0   1  H  4  M
1   1  H  5  D
2   1  E  2  M
3   1  E  7  D
4   1  H  6  M
5   2  E  1  M
6   2  E  3  M
7   2  H  1  D
8   2  H  0  D

我想按 id 分组,并为 agg_B1 中的每个 id 的第 n 次(假设第二次)出现 A = 'H' 的 B 值和第 n 次(假设第一次)出现 C = 的 B 值'M':

desired output:
   id  agg_B1  agg_B2
0   1      5      4  
1   2      0      1

desired_output = df.groupby('id').agg(
      agg_B1= ('B',lambda x:x[df.loc[x.index].loc[df.A== 'H'][1]])
   ,  agg_B2= ('B',lambda x:x[df.loc[x.index].loc[df.C== 'M'][0]])

    ).reset_index()

TypeError: Indexing a Series with DataFrame is not supported, use the appropriate DataFrame column

显然,我在索引方面做错了。


编辑:如果可能的话,我想使用带有 lambda 函数的聚合,因为我想同时提取多个其他类型的聚合输出。

标签: pythonpandasindexinggroup-byaggregate

解决方案


筛选A等于的行,然后使用第 n 个函数H获取第二行:

df.query("A=='H'").groupby("id").nth(1)

    A   B
id      
1   H   5
2   H   0

Python 使用基于零的符号,因此第 2 行将是nth(1)


推荐阅读