You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Pandas将双发言人时序对话转换为问答对DataFrame

对话数据转问答对DataFrame实现方案

我有包含两位发言人“A”“B”的对话数据,每条数据对应一个词汇和时间戳。需要把连续的A发言拼接为问题,后续连续的B发言拼接为对应答案,最终组成问答对存入DataFrame(每行一条问答对)。自己刚学Python,写的代码有问题,求正确实现方法。

示例数据

IndexWordOffsetSpeaker
85the433900000A
86client439300000A
87requirement443600000A
88of449800000A
89migrating451400000A
90to456800000A
91home457400000B
92the462800000A
93snowflake463700000A
94karma509800000B

当前错误代码

import pandas as pd
df2=pd.read_excel(filename="")
df3=pd.DataFrame(index=np.arange(100), columns=["Question","Answer"])
a=[]
j=0
for i in range(len(df2)):
    while(df2["Speaker"][i]=="A"):
       a.append(df2["Word"][i])
df3["Question"][j]=a
a.clear()
    else:
       a.append(df2["Word"][i])
df3["Answer"][j]=a
a.clear()
j=j+1

代码问题分析

  • 缩进错误:else未与对应语句对齐,违反Python语法规则
  • 逻辑错误:while循环会固定在同一索引位置无法推进;未处理发言人切换的边界,无法区分不同轮次的A/B发言
  • 初始化不合理:提前固定df3为100行,易造成空间浪费或存储不足

正确实现方案

方法一:逐行遍历(适合新手理解)

核心逻辑:跟踪当前发言人,收集连续的A/B词汇;当发言人从A切换到B时完成问题收集,从B切换到A时完成答案收集并生成问答对。

import pandas as pd

# 读取对话数据(替换为你的文件路径/正确加载方式)
# df2 = pd.read_excel("你的对话数据文件路径")

# 初始化变量
current_speaker = None
question_words = []
answer_words = []
qa_pairs = []

# 逐行遍历数据
for _, row in df2.iterrows():
    speaker = row["Speaker"]
    word = row["Word"]
    
    if speaker == "A":
        # 若之前在收集B的答案,说明上一轮问答结束,存入列表
        if current_speaker == "B":
            qa_pairs.append({
                "Question": " ".join(question_words),
                "Answer": " ".join(answer_words)
            })
            question_words = []
            answer_words = []
        # 收集当前A的词汇
        question_words.append(word)
    elif speaker == "B":
        # 收集当前B的词汇
        answer_words.append(word)
    
    current_speaker = speaker

# 处理最后一轮未存入的问答对(如果最后是B的发言)
if question_words and answer_words:
    qa_pairs.append({
        "Question": " ".join(question_words),
        "Answer": " ".join(answer_words)
    })

# 转换为DataFrame
qa_df = pd.DataFrame(qa_pairs)
print(qa_df)

方法二:Pandas分组技巧(简洁高效)

利用cumsum()标记不同发言轮次,通过分组聚合快速生成问答对:

import pandas as pd

# 读取对话数据
# df2 = pd.read_excel("你的对话数据文件路径")

# 标记发言人切换位置,生成唯一轮次ID
df2["turn_id"] = (df2["Speaker"] != df2["Speaker"].shift()).cumsum()

# 按轮次分组,聚合词汇和发言人信息
turn_groups = df2.groupby("turn_id").agg({
    "Word": lambda x: " ".join(x),
    "Speaker": "first"
}).reset_index()

# 提取A轮次作为问题,B轮次作为答案并配对
questions = turn_groups[turn_groups["Speaker"] == "A"]["Word"].reset_index(drop=True)
answers = turn_groups[turn_groups["Speaker"] == "B"]["Word"].reset_index(drop=True)

# 生成问答对DataFrame(假设A与B轮次一一对应)
qa_df = pd.DataFrame({
    "Question": questions,
    "Answer": answers
})
print(qa_df)

运行结果

针对示例数据,两种方法都会生成如下DataFrame:

QuestionAnswer
the client requirement of migrating tohome
the snowflakekarma

内容的提问来源于stack exchange,提问作者chicken_man

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 09:25:26