【问题标题】:Python How to do conditional selection after groupbyPython如何在groupby之后进行条件选择
【发布时间】:2021-11-24 01:14:15
【问题描述】:

我有一个大型数据框,其中大部分都有唯一值,但仍然有多个相同的 ID 存储了不同的值。我想对相同的 ID 进行分组,然后对这些 ID 应用逻辑以从中选择一个,然后删除其他 ID。

df = pd.DataFrame({'ID': [11, 11,11,11,22,22,33] ,
                   'Source': [2, 2,4,3,3,2,3],
                   'Price':[10, 20,30,40,50,60,70]})

逻辑是:如果组中有一行 SOURCE==4 保留并删除其他行 else 在组中有一行 SOURCE==2 保留并删除其他行 else 在组中有一行 SOURCE==3 保留并删除其他 所以层次结构是基于源列的,它是4>2>3

预期输出:

expected = pd.DataFrame({'ID': [11,22,33] ,
                   'Source': [4,2,3],
                   'Price':[30,60,70]})

如果 source ==4 then hierarchy ==1... 则创建一个新的层次结构列,然后对其进行排序并选择 nth(1) 。但是我最想知道如何在 groupby 之后进行条件选择。

【问题讨论】:

    标签: python pandas dataframe conditional-statements pandas-groupby


    【解决方案1】:
    d= {4:1,2:2, 3:3} # dict of drop hierarchy
    new=(df.assign(rank=df.Source.map(d))#Create a rank column that maps the hierachy of selection
         .sort_values(by='rank')#Sort new dataframe by rank
         .drop_duplicates(subset='ID',keep='first')#Drop all the duplicated Source values
         .drop('rank',1)#Drop the temp sorting column
        )
    

    打印(新)

        ID  Source  Price
    2  11       4     30
    5  22       2     60
    6  33       3     70
    

    【讨论】:

    • 这就是我克服这个问题的方法,但我想知道在 groupby 之后是否有条件选择的方法,例如:df['pred'] = np.where(df.groupby('ID')['SOURCE'] ==4, df['price'], np.where(['SSOURCE']==2, df[Price'], npwhere(['Source']==3, df['Price'], np.nan))
    • 这也可以。没有条件选择,这就是我删除重复项的原因。
    【解决方案2】:

    我觉得你在寻找偶数和奇数,因此是 4、2、3 的顺序。下面的代码就足够了,并且避免了匿名函数,同时提供了一些加速(取决于数据大小);在我看来,这很冗长:

    (df.assign(even_odd = np.where(df.Source % 2 == 0, 'even', 'odd'))
       .groupby(['ID', 'even_odd'], as_index = False)
       .max()
       .drop_duplicates('ID', keep='first')
       .filter([*df.columns])
     )
       ID  Source  Price
    0  11       4     30
    2  22       2     60
    4  33       3     70
    
    

    当然,如果你有 5、9、6、12、...,这将失败,在这种情况下,需要另一个逻辑。这仅在数字限制为 4、2、3 时才有效

    【讨论】:

      猜你喜欢
      • 2023-03-24
      • 2023-01-23
      • 2019-10-19
      • 2020-01-07
      • 2018-07-28
      • 1970-01-01
      • 2020-12-19
      • 2022-01-10
      • 1970-01-01
      相关资源
      最近更新 更多