Groupby之后的最大负数

时间:2018-02-14 07:12:33

标签: python pandas pandas-groupby

美好的一天,

我想分组合同号&找到最大负数。我正在考虑使用以下代码。

idx = data.groupby(['contract'])['RenVsRec'].max([n for n in data.RenVsRec if n<0])

1 个答案:

答案 0 :(得分:1)

首先按queryboolean indexing过滤,然后汇总max

df = data.query('RenVsRec < 0').groupby('contract')['RenVsRec'].max()
#alternative
#df = data[data['RenVsRec'] < 0].groupby('contract')['RenVsRec'].max()

<强>示例

data = pd.DataFrame({'RenVsRec':[-5,-3,6,-9,2,-4],
                   'contract':list('aaabbb'),
                   'col':range(6)})

print (data)

   RenVsRec  col contract
0        -5    0        a
1        -3    1        a
2         6    2        a
3        -9    3        b
4         2    4        b
5        -4    5        b

df = data.query('RenVsRec < 0').groupby('contract')['RenVsRec'].max()
print (df)
contract
a   -3
b   -4
Name: RenVsRec, dtype: int64

如果希望所有列都使用idxmax作为最大负数的索引,请按loc选择:

df = data.loc[data[data['RenVsRec'] < 0].groupby('contract')['RenVsRec'].idxmax()]

或按contract的最后一行过滤+ sort_values + sort_values + drop_duplicates

df = (data.query('RenVsRec < 0')
          .sort_values(['contract', 'RenVsRec'])
          .drop_duplicates('contract', keep='last'))
print (df)
   RenVsRec  col contract
1        -3    1        a
5        -4    5        b