python - Pandas 中按组标记序列

标签 python pandas dataframe pandas-groupby

我有以下数据框:

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/

相关文章:

python - 使用Python获取hdfs中文件的文件名和扩展名

python - 读取文件夹中的所有 xlsx-Files 并将文件保存在不同的 DataFrame 中

R:从长转为宽并聚合具有匹配 ID 的行

python - 将数据帧转换为字典,如图所示

python - 当我使用python打开URL(维基百科)时,如何得到“ERR_ACCESS_DENIED”?

python - tf.layers.batch_normalization参数

python - 我正在尝试创建一个输入名称并输出排名的函数。创建该功能的最佳方法是什么?

python - 通过连接列在 Python 中格式化时间

python - 如何使用点绘制 Pandas 数据框的两列

python - 替换数据框中的重复值