Python返回组中的第一个匹配项

2024-04-25 23:41:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在寻找一种方法,在一系列基于组的行中找到第一个发生的情况。你知道吗

首先,我对每个组应用了一个“组”计数器。然后我想返回status下第一个或第一个'sell'的ID作为一个新列,并将其应用于整个组。你知道吗

下面的例子。Final\u 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')

但我不确定这样做是否正确。。还有其他想法吗?你知道吗


Tags: 方法viewiddfstatusshowgroup计数器
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

您需要查找已售出的行、删除status列、groupby on group、not on ID、do 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

status不是sold的地方屏蔽你的ID序列,然后按你的组和transformfirst分组,它为每个组选择第一个非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

相关问题 更多 >