我有一个包含一堆问答会话的数据框。每次说话者改变时,数据帧都会有一个新行。我正在尝试为答案分配问题特征,因此我想为每个问答组创建一个 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
答案 0 :(得分:1)
您可以像这样使用 eq
和 cumsum
:
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')