Pandas Dataframe - GroupBy 键并在另一列上保留最大值

Pandas Dataframe - GroupBy key and keep max value on a another column

我需要按键对帧进行分组。对于每个组可能有:

  1. 一对id,其中'max registered'是我需要保留的唯一值
  2. 两对 id:id1-id2 和 id2-id1,其中我需要将最大值保持在它们的 'max registered' 之间,或者如果它们的 'max registered' 相等则只保留其中之一couples(因为id1-id2和id2-id1应该被认为是一对,因为我们不关心一对中id的顺序)
  3. 多于两对 id : 可能是案例 1 = 一对,案例 2 = 两对的组合。它们需要像案例 1 和案例 2 在同一组密钥中一样对待。

这是原始数据框:

df = pd.DataFrame({
                   'first': ['A', 'B', 'A1', 'B1', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'K'],
                   'second': ['B', 'A', 'B1', 'A1', 'D', 'C', 'F', 'E', 'H', 'G', 'J', 'L'],
                   'key': ['AB', 'AB', 'AB', 'AB', 'CD', 'CD', 'EF', 'EF', 'GH', 'GH', 'IJ', 'KL'],
                   'max registered': [10, 5, 10, 5, 'NaN', 15, 10, 5, 'NaN', 'NaN', 'NaN', 15]
                 })
df


    first   second  key max registered
0   A       B       AB  10
1   B       A       AB  5
2   A1      B1      AB  10
3   B1      A1      AB  5
4   C       D       CD  NaN
5   D       C       CD  15
6   E       F       EF  10
7   F       E       EF  5
8   G       H       GH  NaN
9   H       G       GH  NaN
10  I       J       IJ  NaN
11  K       L       KL  15

数据框在分组后应该是什么样子(我的问题来了)aggregated/filtered/transformed/applied?我不知道在对我的数据进行分组后该怎么做以及我应该选择什么解决方案。

df = pd.DataFrame({
                   'first': ['A', 'A1', 'D', 'E', 'G', 'I', 'K'],
                   'second': ['B', 'B1', 'C', 'F', 'H', 'J', 'L'],
                   'key': ['AB', 'AB', 'CD', 'EF', 'GH', 'IJ', 'KL'],
                   'max registered': [10, 10, 15, 10, 'NaN', 'NaN', 15]
                 })
df

    first   second  key max registered
0   A       B       AB  10
1   A1      B1      AB  10
2   D       C       CD  15
3   E       F       EF  10
4   G       H       GH  NaN
5   I       J       IJ  NaN
6   K       L       KL  15

我在看有关 groupby() 和 pandas 文档的教程已有 2 天了,但没有找到任何关于其背后逻辑的线索以及我应该如何做。我的问题(如我所见)更复杂并且与那些教程中处理的内容没有真正关系(例如 this one 我看过几次)

firstsecond 列创建有序组。 key 在这里没用,因为您希望每个子组的所有最大值((A,B) 的最大值和 (A1,B1) 的最大值)然后按 max registered 降序对值进行排序。最后按这个虚拟组分组并保留第一个值(最大值):

out = df.assign(group=df[['first', 'second']].apply(frozenset, axis=1)) \
        .sort_values('max registered', ascending=False) \
        .groupby('group').head(1).sort_index()
print(out)

   first second key  max registered     group
0      A      B  AB            10.0    (A, B)
2     A1     B1  AB            10.0  (B1, A1)
5      D      C  CD            15.0    (C, D)
6      E      F  EF            10.0    (E, F)
8      G      H  GH             NaN    (G, H)
10     I      J  IJ             NaN    (J, I)
11     K      L  KL            15.0    (K, L)