我一直在寻找一种方法来找到基于组的一系列行中的第一次出现。
首先,我检查并为每个组应用了一个“组”计数器。然后我想将状态下第一个“已售出”的 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
关于Python 返回组中的第一次出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57482571/