【问题标题】:get first row in a group and assign values获取组中的第一行并分配值
【发布时间】:2021-12-06 21:06:37
【问题描述】:

我有一个以下格式的熊猫数据框

 id   name  value_1  value_2
 1    def   1        0
 2    abc   0        1

我需要根据 id、name、value_1 和 value_2 对上述数据框进行排序。之后,对于 [id,name,value_1,value_2] 的每一组,获取第一行并设置 df['result'] = 1。对于该组中的其他行,设置 df['result'] = 0。

我使用以下代码进行排序并获取第一行:

df = df.sort_values(["id","name","value_1","value_2"], ascending=True)
first_row_per_group = df.groupby(["id","name","value_1","value_2"]).agg('first')

获得第一行后,我设置了 first_row_per_group ['result'] = 1。但我不确定如何将其他行(非第一行)设置为 0。

任何建议将不胜感激。

【问题讨论】:

    标签: pandas aggregate-functions


    【解决方案1】:

    duplicated 会比groupby 快:

    df = df.sort_values(['id', 'name', 'value_1', 'value_2'])
    df['result'] = (~df['id'].duplicated()).astype(int)
    

    【讨论】:

      【解决方案2】:

      使用df.groupby(...).cumcount() 获取组内的行计数器,然后您可以对其进行操作。

      In [51]: df
      Out[51]:
           a  b  c
      0  def  1  0
      1  abc  0  1
      2  def  1  0
      3  abc  0  1
      
      In [52]: df2 = df.sort_values(['a','b','c'])
      
      In [53]: df2['result'] = df2.groupby(['a', 'b', 'c']).cumcount()
      
      In [54]: df2['result'] = np.where(df2['result'] == 0, 1, 0)
      
      In [55]: df2
      Out[55]:
           a  b  c  result
      1  abc  0  1       1
      3  abc  0  1       0
      0  def  1  0       1
      2  def  1  0       0
      

      【讨论】:

        猜你喜欢
        • 2015-01-16
        • 1970-01-01
        • 2017-12-25
        • 2020-11-23
        • 1970-01-01
        • 1970-01-01
        • 2014-09-29
        • 2019-05-23
        • 1970-01-01
        相关资源
        最近更新 更多