【问题标题】:Python Return the First Occurrence in a GroupPython 返回组中的第一次出现
【发布时间】:2019-12-20 07:05:20
【问题描述】:

我一直在寻找一种方法来根据组在一系列行中找到第一次出现。

首先,我检查并为每个组应用了一个“组”计数器。然后我想将状态下“已售”的第一个 orruance 的 ID 作为新列返回,并将其应用于整个组。

示例如下。 Final_ID 是要创建的新列。

group  ID   status  Final_ID
1      100  view    103
1      101  show    103
1      102  offer   103
1      103  sold    103
1      104  view    103
2      105  view    106
2      106  sold    106
2      107  sold    106
3      108  pending 109
3      109  sold    109
3      110  view    109
4      111  sold    111
4      112  sold    111
4      113  sold    111
4      114  sold    111

我尝试过使用

df = pd.DataFrame ({'group':['1','1','1','1','1','2','2','2','3','3','3','4','4','4','4'], 
                    'ID':['100','101','102','103','104','105','106','107','108','109','110','111','112','113','114'],
                    'status':['view','show','offer','sold','view','view','sold','sold','pending','sold','view','sold','sold','sold','sold']
                    })


df2=df[( df.status=='sold')][['group','ID']].groupby('group'['ID'].apply(min).reset_index()

df2=df.merge(df2, on='group' , how='left')

但我不确定这是否是正确的方法。还有其他想法吗?

【问题讨论】:

    标签: python string pandas list min


    【解决方案1】:

    如果status 不是sold,则屏蔽您的ID 系列,然后按您的组和transform first 分组,这将为每个组选择第一个非NaN 值,在这种情况下是第一次出现sold


    df['ID'].mask(df['status'] != 'sold').groupby(df['group']).transform('first').astype(int)
    

    0     103
    1     103
    2     103
    3     103
    4     103
    5     106
    6     106
    7     106
    8     109
    9     109
    10    109
    11    111
    12    111
    13    111
    14    111
    Name: Final_ID, dtype: int32
    

    【讨论】:

      【解决方案2】:

      您需要查找已售出的行,删除 status 列,groupby 到 group,而不是 ID,执行 min

      df.merge(df.loc[df.status=='sold'].drop('status',1).groupby(['group'], as_index=False).min()
                 .rename(columns={'ID': 'Final_ID'}))
      

      输出:

         group   ID   status  Final_ID
      0      1  100     view       103
      1      1  101     show       103
      2      1  102    offer       103
      3      1  103     sold       103
      4      1  104     view       103
      5      2  105     view       106
      6      2  106     sold       106
      7      2  107     sold       106
      8      3  108  pending       109
      9      3  109     sold       109
      10     3  110     view       109
      11     4  111     sold       111
      12     4  112     sold       111
      13     4  113     sold       111
      14     4  114     sold       111
      

      【讨论】:

        【解决方案3】:

        假设 ID 列已经排序,你可以这样做:

        (
            df.set_index('group')
            .assign(Final_ID=df.loc[df.status=='sold'].groupby(by='group').ID.first())
            .reset_index()
        )
        
        group   ID  status  Final_ID
        0   1   100 view    103
        1   1   101 show    103
        2   1   102 offer   103
        3   1   103 sold    103
        4   1   104 view    103
        5   2   105 view    106
        6   2   106 sold    106
        7   2   107 sold    106
        8   3   108 pending 109
        9   3   109 sold    109
        10  3   110 view    109
        11  4   111 sold    111
        12  4   112 sold    111
        13  4   113 sold    111
        14  4   114 sold    111
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-02-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-12
          • 2020-11-14
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多