python查找列中集合的第二次出现

python查找列中集合的第二次出现,python,pandas,numpy,pandas-groupby,Python,Pandas,Numpy,Pandas Groupby,我有一个数据帧: 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

我有一个数据帧:

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

你能详细说明一下这里发生了什么事吗?当我尝试此操作时,我得到一个长度不匹配错误:预期轴有729261个元素,新值有729262个元素。我无法复制您的错误。大致上,我们检查一个值是否为
Y
,是否与之前的值不同。取累积和,减去1,因此我们从0开始,只过滤
Y
(否则使用null)的值,用0填充null,转换为整数,然后转换为字符串。最后删除0。由小组执行以上所有操作。这很有效,谢谢!该错误是由于我的数据帧中的另一行没有附加ID造成的。放下这一排就解决了问题。