基于Pandas将双发言人时序对话转换为问答对DataFrame
对话数据转问答对DataFrame实现方案
我有包含两位发言人“A”“B”的对话数据,每条数据对应一个词汇和时间戳。需要把连续的A发言拼接为问题,后续连续的B发言拼接为对应答案,最终组成问答对存入DataFrame(每行一条问答对)。自己刚学Python,写的代码有问题,求正确实现方法。
示例数据
| Index | Word | Offset | Speaker |
|---|---|---|---|
| 85 | the | 433900000 | A |
| 86 | client | 439300000 | A |
| 87 | requirement | 443600000 | A |
| 88 | of | 449800000 | A |
| 89 | migrating | 451400000 | A |
| 90 | to | 456800000 | A |
| 91 | home | 457400000 | B |
| 92 | the | 462800000 | A |
| 93 | snowflake | 463700000 | A |
| 94 | karma | 509800000 | B |
当前错误代码
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:
| Question | Answer |
|---|---|
| the client requirement of migrating to | home |
| the snowflake | karma |
内容的提问来源于stack exchange,提问作者chicken_man
相关产品推荐
相关产品推荐

