【问题标题】:Rebase csv file by merging a base csv file with another new csv file通过将基本 csv 文件与另一个新的 csv 文件合并来重新设置 csv 文件
【发布时间】:2017-05-03 08:57:45
【问题描述】:

我目前正在处理两个 csv 文件 base.csv 和另一个 csv 文件 output_20170503.csv,它们将每天生成,所以我的目标是重新设置每个输出的基础,以便它们具有与 base.csv 相同的数据.

我的 base.csv:

ID,Name,Number,Shape,Sound
1,John,45,Round,Meow
2,Jimmy,78,Sphere,Woof
3,Marc,,Triangle,Quack
4,Yun,50,Triangle,Meow
5,Nyancat,,Round,Quack

我的输出_20170503.csv

ID,Name,Number,Shape,Sound
1,John,,Round,Meow
2,Jimmy,,Sphere,Woof
3,Marc,,Triangle,Quack
4,Yun,,Triangle,
5,Nyancat,,Round,Quack
6,Marc,,Square,Woof
7,Jonnn,,Hexagon,Chirp

这里的目标是使用 output_20170503.csv 重新设置 base.csv 中的数据(ID 为 1-5)

我想要达到的目标:

ID,Name,Number,Shape,Sound
1,John,45,Round,Meow
2,Jimmy,78,Sphere,Woof
3,Marc,,Triangle,Quack
4,Yun,50,Triangle,Meow
5,Nyancat,,Round,Quack
6,Marc,,Square,Woof
7,Jonnn,,Hexagon,Chirp

我已经搜索了解决方案,但我得到了什么;

合并两个 csv 文件(两个 csv 文件都有不同的列,对我不起作用)

从 csv 文件中删除重复项(将 base.csv 附加到 output_20170503.csv 中,然后删除重复项,因为它们的列 Number 具有不同的值,所以不起作用)

任何帮助将不胜感激,谢谢。

【问题讨论】:

  • ID=4 得到空 Number 而 ID=5 得到 Number=50 是怎么回事?
  • @agamagarwal 抱歉,打错了,改了。感谢您的关注

标签: python csv python-2.x


【解决方案1】:

你可以试试这个,我使用前两项作为键并生成一个字典,然后迭代 new 字典如果键不在 base 中,则更新 base 字典:

new = {"".join(i.split(',')[:2]): i[:-1].split(',') for i in open('output_20170503.csv')}
base = {"".join(i.split(',')[:2]): i[:-1].split(',') for i in open('base.csv')}

base.update({i: new[i] for i in new if i not in base})
f=open("out.csv","w")
for i in sorted(base.values(), key=lambda x: x[0]):
    if i[0]!="ID":
        f.write(",".join(i)+"\n")

输出:

1,John,45,Round,Meow
2,Jimmy,78,Sphere,Woof
3,Marc,,Triangle,Quack
4,Yun,50,Triangle,Meow
5,Nyancat,,Round,Quac
6,Marc,,Square,Woof
7,Jonnn,,Hexagon,Chir

Python2.7+ 支持称为“字典理解”或“字典理解”的语法扩展,因此如果您使用的是 Python2.6,则需要将前三行替换为:

new = dict(("".join(i.split(',')[:2]),i[:-1].split(',')) for i in open('output_20170503.csv'))
base = dict(("".join(i.split(',')[:2]),i[:-1].split(',')) for i in open('base.csv'))

base.update(dict((i,new[i]) for i in new if i not in base))

【讨论】:

  • for 循环出现语法错误,顺便说一句,我使用的是 python v2.6..new = {"".join(i.split(';')[:1]): i[:-1].split(';') for i in open(new_devicedb)}
  • 谢谢,但基本更新在 for 循环中也有语法错误。 base.update({i: new[i] for i in new if i not in base})我需要导入任何库吗?
  • @yunaranyancat 更新。
  • 把','改成';',如果值是分号分隔的会一样吗?
  • @yunaranyancat 当然
【解决方案2】:

您应该尝试使用非常适合数据操作的pandas 库。您可以轻松阅读 csv 文件并执行merge operation。您的解决方案可能如下所示:

import pandas as pd

base_df = pd.read_csv('base.csv')
output_df = pd.read_csv('My output_20170503.csv')

output_df.update(base_df)

output_df.write_csv('My output_20170503.csv')

output_df 上的缺失值现已更新为 base_df 中的缺失值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-30
    • 2019-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多