如何将NLTK生成的二元组频率字典按两列写入CSV文件?
修复二元组写入CSV的列拆分问题
问题根源
你用frequency.most_common(100)拿到的是((word1, word2), count)格式的元组列表,直接丢给Pandas的DataFrame时,整个二元组会被当成word列的单个单元格值,最终导致CSV里所有内容挤在同一列。
解决方案1:用Pandas拆分二元组为独立列
如果希望把二元组的两个词分成两列(比如A列word1、B列word2、C列count),可以拆分二元组列:
import pandas as pd from nltk import FreqDist # 假设已生成frequency = FreqDist(bigrams) common = frequency.most_common(100) # 先把元组列表转成DataFrame df = pd.DataFrame(common, columns=['bigram', 'count']) # 拆分二元组为两个独立列 df[['word1', 'word2']] = pd.DataFrame(df['bigram'].tolist(), index=df.index) # 调整列顺序并移除原bigram列 df = df[['word1', 'word2', 'count']] # 写入CSV df.to_csv("output.csv", index=False)
解决方案2:直接用csv模块写入(无需Pandas)
如果不想依赖Pandas,用原生csv模块更直接,手动拆分二元组写入:
import csv from nltk import FreqDist # 假设已生成frequency = FreqDist(bigrams) common = frequency.most_common(100) with open("output.csv", "w", newline="", encoding="utf-8") as f: writer = csv.writer(f) # 写入表头 writer.writerow(["word1", "word2", "count"]) # 遍历每个二元组和计数,逐行写入 for (word1, word2), count in common: writer.writerow([word1, word2, count])
补充:若需保留二元组为单独一列
如果你确实希望A列存储完整的二元组(比如(word1, word2))、B列存计数,之前的问题可能是CSV打开时的分隔符识别问题。可以显式指定分隔符,确保打开时正确拆分:
pd.DataFrame(common, columns=['bigram', 'count']).to_csv("output.csv", index=False, sep=",")
用Excel打开时,选择「数据」→「自文本/CSV」,指定逗号为分隔符即可正确分成两列。
内容的提问来源于stack exchange,提问作者mxrdybxm
相关产品推荐
相关产品推荐

