我有一个如下所示的熊猫数据框。我想根据所有三列进行分组,并保留最大为 Col1 的组。
import pandas as pd
df = pd.DataFrame({'col1':['A', 'A', 'A', 'A', 'B', 'B'], 'col2':['1', '1', '1', '1', '2', '3'], 'col3':['5', '5', '2', '2', '2', '3']})
df
col1 col2 col3
0 A 1 5
1 A 1 5
2 A 1 2
3 A 1 2
4 B 2 2
5 B 3 3
我的预期输出
col1 col2 col3
0 A 1 5
1 A 1 5
4 B 2 2
5 B 3 3
我尝试了下面的代码,但它返回了每组的最后一行,而不是我想按 col3 排序并保留最大 col3 的组
df.drop_duplicates(keep='last', subset=['col1','col2','col3'])
col1 col2 col3
1 A 1 5
3 A 1 2
4 B 2 2
5 B 3 3
例如:这里我想删除第一个组,因为 2 < 5,所以我想保留 col3 为 5 的组
df.sort_values(by=['col1', 'col2', 'col3'], ascending=False)
a_group = df.groupby(['col1', 'col2', 'col3'])
for name, group in a_group:
group = group.reset_index(drop=True)
print(group)
col1 col2 col3
0 A 1 2
1 A 1 2
col1 col2 col3
0 A 1 5
1 A 1 5
col1 col2 col3
0 B 2 2
col1 col2 col3
0 B 3 3
答案 0 :(得分:3)
您不能对所有列进行分组,因为您希望保留最大值的列具有不同的值。相反,不要将该列包含在组中并考虑其他列:
col_to_max = 'col3'
i = df.columns ^ [col_to_max]
out = df[df[col_to_max] == df.groupby(list(i))[col_to_max].transform('max')]
print(out)
col1 col2 col3
0 A 1 5
1 A 1 5
4 B 2 2
5 B 3 3
答案 1 :(得分:2)
所以我们可以做
out = df[df.col3==df.groupby(['col1','col2'])['col3'].transform('max')]
col1 col2 col3
0 A 1 5
1 A 1 5
4 B 2 2
5 B 3 3
答案 2 :(得分:1)
我相信您可以将 groupby
与 nlargest(2)
一起使用。还要确保您的“col3”是数字。
>>> df['col3'] = df['col3'].astype(int)
>>> df.groupby(['col1','col2'])['col3'].nlargest(2).reset_index().drop('level_2',axis=1)
col1 col2 col3
0 A 1 5
1 A 1 5
2 B 2 2
3 B 3 3
答案 3 :(得分:1)
你可以得到没有index
最大值和重复索引的col3
并删除交集
ind = df.assign(max = df.groupby("col1")["col3"].transform("max")).query("max != col3").index
ind2 = df[df.duplicated(keep=False)].index
df.drop(set(ind).intersection(ind2))
col1 col2 col3
0 A 1 5
1 A 1 5
4 B 2 2
5 B 3 3