希望获得一组在多列中具有最大值的行:
pd.DataFrame([{'grouper': 'a', 'col1': 1, 'col2': 3, 'uniq_id': 1}, {'grouper': 'a', 'col1': 2, 'col2': 4, 'uniq_id': 2}, {'grouper': 'a', 'col1': 3, 'col2': 2, 'uniq_id': 3}])
col1 col2 grouper uniq_id
0 1 3 a 1
1 2 4 a 2
2 3 2 a 3
在上面,我按“石斑鱼”列分组。在“ a”组中,我想获取最大为col1
和col2
的行,在这种情况下,当我对DataFrame进行分组时,我想使用{{1 uniq_id
中的}},因为它的col1 / col2值最高,为4,因此结果为:
2
在我的实际示例中,我使用的是时间戳记,所以我实际上并不期望联系。但是,如果是平局,我对在组中选择哪一行都无所谓,因此在这种情况下,它只是该组的 col1 col2 grouper uniq_id
1 2 4 a 2
。
答案 0 :(得分:3)
您可以尝试的另一种方式:
# find row wise max value
df['row_max'] = df[['col1','col2']].max(axis=1)
# filter rows from groups
df.loc[df.groupby('grouper')['row_max'].idxmax()]
col1 col2 grouper uniq_id row_max
1 2 4 a 2 4
稍后您可以使用row_max
丢下df.drop('row_max', axis=1)
答案 1 :(得分:2)
IIUC使用transform
,然后与原始数据帧进行比较
g=df.groupby('grouper')
s1=g.col1.transform('max')
s2=g.col2.transform('max')
s=pd.concat([s1,s2],axis=1).max(1)
df.loc[df[['col1','col2']].eq(s,0).any(1)]
Out[89]:
col1 col2 grouper uniq_id
1 2 4 a 2
答案 2 :(得分:2)
有趣的方法到处都是。添加另一个只是为了展示apply
(我非常喜欢)的功能,并使用其他提到的方法。
import pandas as pd
df = pd.DataFrame(
[
{"grouper": "a", "col1": 1, "col2": 3, "uniq_id": 1},
{"grouper": "a", "col1": 2, "col2": 4, "uniq_id": 2},
{"grouper": "a", "col1": 3, "col2": 2, "uniq_id": 3},
]
)
def find_max(grp):
# find max value per row, then find index of row with max val
max_row_idx = grp[["col1", "col2"]].max(axis=1).idxmax()
return grp.loc[max_row_idx]
df.groupby("grouper").apply(find_max)
答案 3 :(得分:0)
value = pd.concat([df['col1'], df['col2']], axis = 0).max()
df.loc[(df['col1'] == value) | (df['col2'] == value), :]
col1 col2 grouper uniq_id
1 2 4 a 2
这可能不是最快的方法,但是可以解决您的问题。合并两列并找到最大值,然后在df中搜索任一列等于该值的位置。
答案 4 :(得分:0)
您可以按以下方式使用numpy和pandas:
import numpy as np
import pandas as pd
df = pd.DataFrame({'col1': [1, 2, 3],
'col2': [3, 4, 2],
'grouper': ['a', 'a', 'a'],
'uniq_id': [1, 2, 3]})
df['temp'] = np.max([df.col1.values, df.col2.values],axis=0)
idx = df.groupby('grouper')['temp'].idxmax()
df.loc[idx].drop('temp',1)
col1 col2 grouper uniq_id
1 2 4 a 2