Pandas group by 2 columns,apply function,select max value和return index values

时间:2018-05-18 00:02:11

标签: python pandas

以下是我要做的操作:

    ID    SUB_ID    AMOUNT

1   101     1        50
2   101     1        -10
3   101     1        -20
4   101     2        30
5   101     2        20
6   102     3        10
7   102     3        -10
8   102     4        10
9   102     4        10

我们希望按IDSUB_ID进行分组,然后获取AMOUNT的绝对值之和。然后在ID组中订购此总结列,并返回最大值的SUB_ID值。

我们可以通过以下方式得到总结:

df1 = (df
    .groupby(['ID','SUB_ID'])
    .apply(lambda x: np.sum(np.absolute(x['AMOUNT']))))
)

这将返回带有MultiIndex的系列

 ID    SUB_ID    

 101     1        80
         2        50
 102     3        20
         4        20

从这里我想返回[1,3]([1,4]也被接受,因为102组中的两个值是相同的,但我们希望每组只返回一个值!)

显然我们可以循环并选择最大值,但我试图找出最有效的方法。此操作将应用于数百万行。

2 个答案:

答案 0 :(得分:2)

这是一种方式。由于您的数据集很大,我强烈建议您避免使用lambda函数,因为这些函数不会以矢量化方式应用。

res = df.assign(AMOUNT=df['AMOUNT'].abs())\
        .groupby(['ID', 'SUB_ID'], as_index=False).sum()\
        .sort_values('AMOUNT', ascending=False)\
        .groupby('ID').head(1)

示例

df = pd.DataFrame([[101, 1, 50], [101, 1, -10], [101, 1, -20], [101, 2, 30],
                   [101, 2, 20], [102, 3, 10], [102, 3, -10], [102, 4, 10], [102, 4, 10]],
                  columns=['ID', 'SUB_ID', 'AMOUNT'])

res = df.assign(AMOUNT=df['AMOUNT'].abs())\
        .groupby(['ID', 'SUB_ID'], as_index=False).sum()\
        .sort_values('AMOUNT', ascending=False)\
        .groupby('ID').head(1)

print(res)

    ID  SUB_ID  AMOUNT
0  101       1      80
2  102       3      20

答案 1 :(得分:1)

我认为你可以使用nlargest

df1.groupby('ID').nlargest(1).index.get_level_values(level='SUB_ID').tolist()

# [1, 3]