使用根据另一列的值更改的组 ID 创建新列

时间:2021-06-16 16:53:40

标签: python pandas

我有一个包含一堆问答会话的数据框。每次说话者改变时,数据帧都会有一个新行。我正在尝试为答案分配问题特征,因此我想为每个问答组创建一个 ID。在下面的示例中,我想在每次提出新问题时增加 id(speakertype_id == 3 => 问题;speakertype_id == 4 => 答案)。我目前像这样循环遍历数据框:

Q_A = pd.DataFrame({'qna_id':[9]*10,
                    'qnacomponentid':[3,4,5,6,7,8,9,10,11,12],
                    'speakertype_id':[3,4,3,4,4,4,3,4,3,4]})


group = [0]*len(Q_A)
j = 1
for index,row in enumerate(Q_A.itertuples()):
    if row[3] == 3: 
        j+=1
    group[index] = j

Q_A['group'] = group

这给了我想要的输出并且比我预期的要快得多,但是 this post 让我怀疑我是否应该迭代一个 Pandas 数据帧。关于更好的方法的任何想法?谢谢。

**编辑:预期输出:

qna_id  qnacomponentid  speakertype_id  group
9   3   3   2
9   4   4   2
9   5   3   3
9   6   4   3
9   7   4   3
9   8   4   3
9   9   3   4
9   10  4   4
9   11  3   5
9   12  4   5

2 个答案:

答案 0 :(得分:1)

您可以像这样使用 eqcumsum

Q_A['gr2'] = Q_A['speakertype_id'].eq(3).cumsum()
print(Q_A)
   qna_id  qnacomponentid  speakertype_id  group  gr2
0       9               3               3      2    1
1       9               4               4      2    1
2       9               5               3      3    2
3       9               6               4      3    2
4       9               7               4      3    2
5       9               8               4      3    2
6       9               9               3      4    3
7       9              10               4      4    3
8       9              11               3      5    4
9       9              12               4      5    4

请注意,不确定您是否有任何理由从 2 开始,但如果需要,您可以在 +1 后添加 cumsum

答案 1 :(得分:1)

我按照您的输出进行了复制:

Q_A['cumsum'] = Q_A[Q_A.speakertype_id!=Q_A.speakertype_id.shift()].groupby('speakertype_id').cumcount()+2
Q_A['cumsum'] = Q_A['cumsum'].ffill().astype('int')
相关问题