[英]python find second occurence of a set in a column
我有一個數據框:
ID Status
100 X
100 Y
100 Y
100 Z
100 A
100 Y
100 Y
100 Y
100 X
100 X
100 Y
100 Y
200 A
200 B
200 Y
200 Y
200 C
200 Y
200 Y
200 Z
對於元素Y的每個非連續出現,我希望狀態根據Y出現的次數而改變。 我的預期輸出是:
ID Status
100 X
100 Y
100 Y
100 Z
100 A
100 Y1
100 Y1
100 Y1
100 X
100 X
100 Y2
100 Y2
200 A
200 B
200 Y
200 Y
200 C
200 Y1
200 Y1
200 Z
我嘗試了以下方法:
df['index'] = pd.np.where(df['Status']==Y, df.groupby(['ID']).cumcount(),0)
索引每個Y的出現。然后我像這樣計算差異:
df['diff'] = df['index'] - df['index'].shift(1)
然后,我選擇每個點df ['diff']> 1變為新的狀態值'Y1'。
df['Status']=pd.np.where(df['diff']>1, 'Y1', df['Status'])
但是,以上內容標識了發生Y的每個點。 我需要過濾掉第一次出現Y並解決后續出現的問題。 即使輸出以下內容,我也沒問題:
ID Status
100 X
100 Y
100 Y
100 Z
100 A
100 Y1
100 Y1
100 Y1
100 X
100 X
100 Y1
100 Y1
200 A
200 B
200 Y
200 Y
200 C
200 Y1
200 Y1
200 Z
這是通過groupby
+ transform
的一種方法:
def enum(x):
mask = x.eq('Y')
y = mask & x.ne(x.shift())
z = y.cumsum().sub(1).where(mask).fillna(0).astype(int).astype(str)
return z.mask(z == '0', '')
df['Status'] += df.groupby('ID')['Status'].transform(enum)
print(df)
ID Status
0 100 X
1 100 Y
2 100 Y
3 100 Z
4 100 A
5 100 Y1
6 100 Y1
7 100 Y1
8 100 X
9 100 X
10 100 Y2
11 100 Y2
12 200 A
13 200 B
14 200 Y
15 200 Y
16 200 C
17 200 Y1
18 200 Y1
19 200 Z
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.