我有以下数据框:
df = pd.DataFrame({'ID_1' : ['i1','i1','i1','i1','i1','i1','i1','i1'],
'ID_2' : ['a1','a1','a1','a1','a2','a2','a2','a2'],
'label':['a','b','b','a','a','a','a','b']})
我想获取每个组 ('ID_1' , 'ID_2')
的 'label'
序列的 id,以便输出为:
ID_1 ID_2 label seq_id
i1 a1 a 1
i1 a1 b 2
i1 a1 b 2
i1 a1 a 3
i1 a2 a 1
i1 a2 a 1
i1 a2 a 1
i1 a2 b 2
如果该组不是一个问题,那么这会起作用:
df['id_seq'] = df['label'].shift(1) != df['label']).cumsum()
所以我尝试用以下内容对其进行调整:
df['shifted_label'] = df.groupby(['ID_1','ID_2']).label.shift(1)
def get_sequence_group(grouped) :
return (grouped['shifted_label'] != grouped['label']).cumsum()
df.groupby(['ID_1','ID_2']).apply(get_sequence_group)
但是它根本不起作用。想了解原因以及如何进行。谢谢!
最佳答案
为了保持其完全矢量化,我们可以使用 shift
对差异进行分组。这样我们就可以避免使用 apply
diff = df['label'].ne(df['label'].shift())
df['seq_id'] = diff.groupby([df['ID_1'], df['ID_2']]).cumsum()
ID_1 ID_2 label seq_id
0 i1 a1 a 1
1 i1 a1 b 2
2 i1 a1 b 2
3 i1 a1 a 3
4 i1 a2 a 0
5 i1 a2 a 0
6 i1 a2 a 0
7 i1 a2 b 1
关于python - Pandas 中按组标记序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64234348/