【问题标题】:Merge two tables (CSV) if (table1 column A == table2 column A)合并两个表 (CSV) if (table1 column A == table2 column A)
【发布时间】:2014-03-13 04:28:10
【问题描述】:

我有两个 CSV,可在 Numbers 或 Excel 中打开,结构化:
| word | num1 |

| word | num2 |

如果这两个词相等(比如它们都是“hi”和“hi”),我希望它变成:
| word | num1 | num2 |

这里有一些图片:

就像第 1 行一样,因为两个词都相同,“TRUE”,我希望它变成类似
| TRUE | 5.371748 | 4.48957 |

通过一些小脚本,或者如果有一些我忽略的特性/功能。
谢谢!

【问题讨论】:

    标签: python excel csv formatting


    【解决方案1】:

    我认为您正在寻找的是zip,让您可以同步迭代两个 CSV:

    with open('file1.csv', 'rb') as f1, open('file2.csv', 'rb') as f2:
        r1, r2 = csv.reader(f1), csv.reader(f2)
        with open('out.csv', 'wb') as fout:
            w = csv.writer(fout)
            for row1, row2 in zip(r1, r2):
                if row1[0] == row2[0]:
                    w.writerow([row1[0], row1[1], row2[1]])
    

    如果他们相等,我不确定你想要发生什么。也许像这样插入两行?

                else:
                    w.writerow([row1[0], row1[1], ''])
                    w.writerow([row2[0], '', row2[1]])
    

    【讨论】:

    • 几乎有效。问题是我的前两个 csv 文件没有“同步”...最终出现this 之类的问题(请注意“100%”的双重输入)。
    • @AndrewSB:你需要解释你真正想要做什么。给我们一些(小)样本输入和预期输出,解释任何不明显的东西。
    【解决方案2】:

    使用字典:

    with open('file1.csv', 'rb') as file_a, open('file2.csv', 'rb') as file_b:
        data_a = csv.reader(file_a)
        data_b = dict(csv.reader(file_b))  # <-- dict
        with open('out.csv', 'wb') as file_out:
            csv_out = csv.writer(file_out)
            for word, num_a in data_a:
                csv_out.writerow([word, num_a, data_b.get(word, '')])  # <-- edit
    

    (未经测试)

    【讨论】:

    • 在正确的轨道上,但它在 每个和每个字符之间放置一个逗号。 See?。我应该改变什么?
    • 糟糕!少了一对括号。请查看我的编辑。
    • 这几乎可以完美运行。无论如何要向字典中添加 don't 在两个 csv 中都存在的单词?例如,假设第一个 csv 中有一个单词不在第二个 csv 中,您可以只添加第一个 csv 中的单词和数字,而将第三列留空吗?
    【解决方案3】:

    对于csv,我总是使用数据分析库pandashttp://pandas.pydata.org/

    import pandas as pd
    
    df1 = pd.read_csv('file1.csv', names=['word','num1'])
    df2 = pd.read_csv('file2.csv', names=['word','num2'])
    df3 = pd.merge(df1, df2, on='word')
    df3.to_csv('merged_data.csv')
    

    【讨论】:

      猜你喜欢
      • 2023-01-25
      • 2022-08-03
      • 2022-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-02
      • 2022-12-02
      • 1970-01-01
      相关资源
      最近更新 更多