Skip to main content
 首页 » 编程设计

Python 返回组中的第一次出现

2025年05月04日19xing901022

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

首先,我检查并为每个组应用了一个“组”计数器。然后我想将状态下第一个“已售出”的 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') 

但我不确定这是解决问题的正确方法。还有其他想法吗?

请您参考如下方法:

在状态未出售的地方屏蔽您的ID系列,然后将您的组分组并转换 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