美好的一天,
我想分组合同号&找到最大负数。我正在考虑使用以下代码。
idx = data.groupby(['contract'])['RenVsRec'].max([n for n in data.RenVsRec if n<0])
答案 0 :(得分:1)
首先按query
或boolean 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