簡體   English   中英

Pandas Dataframe - GroupBy 鍵並將最大值保留在另一列

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

我需要按鍵對幀進行分組。 每個組可能有:

  1. 一對 id,其中“最大注冊”是我需要保留的唯一值
  2. 兩對 id:id1-id2 和 id2-id1 我需要保持他們的“注冊的最大”或其中一個之間的最大值,如果他們的“注冊的最大”相等並且只保留其中一對(因為 id1-id2 和id2-id1 應該被視為一對,因為我們不關心id在一對中的順序)
  3. 多於兩對 id:可能是案例 1 = 一對,案例 2 = 兩對的組合。 在同一組密鑰中,它們需要像案例 1 和案例 2 一樣對待。

這是原始的dataframe:

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

這是 dataframe 一旦被分組和(這是我的問題)聚合/過濾/轉換/應用后的樣子? 在對我的數據進行分組以及我應該選擇什么解決方案之后,我不知道該怎么做。

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

自 2 天以來,我一直在看關於 groupby() 和 pandas 文檔的教程,但沒有找到任何關於其背后邏輯的線索以及我應該這樣做的方式。 我的問題(如我所見)更復雜,並且與那些教程中處理的內容無關(例如我看過幾次的這個

first列和second列創建有序組。 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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM