在python更新中组合两个csv(如果在较新的csv中存在)

2024-05-18 09:39:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试合并两个csv,即更新由旧数据(old.csv)组成的csv,如果新数据(new.csv)的csv中存在新数据(new.csv)。两者的列数(标题)相同,并且可以通过唯一的id进行标识

old.csv

id,description,listing,url,default
2471582,spacex,536,www.spacex.com,0
3257236,alibaba,875,www.alibaba.com,0
3539697,ethihad,344,www.etihad.com,0
2324566,pretzel,188,www.example.com,1

new.csv

id,description,listing,url,default
2471582,spacex,888,www.spacex.com,0
3539697,ethihad,348,www.etihad.com,0
2324566,pretzel,396,www.pretzelshopexample12345.com,1

以下是我迄今为止在Python&;熊猫:

import pandas as pd
f1 = pd.read_csv('old.csv', delimiter=',')
f2 = pd.read_csv('new.csv', delimiter=',')
with open('final.csv', 'w', encoding='utf-8', newline='') as out:
    pd.merge(f1, f2, on='id', how='left').to_csv(out, sep=',', index=False)

电流输出:

id,description_x,listing_x,url_x,default_x,description_y,listing_y,url_y,default_y
2471582,spacex,536,www.spacex.com,0,spacex,888.0,www.spacex.com,0.0
3257236,alibaba,875,www.alibaba.com,0,,,,
3539697,ethihad,344,www.etihad.com,0,ethihad,348.0,www.etihad.com,0.0
2324566,pretzel,188,www.example.com,1,pretzel,396.0,www.pretzelshopexample12345.com,1.0

我正在努力实现的目标:

id,description,listing,url,default
2471582,spacex,888,www.spacex.com,0
3257236,alibaba,875,www.alibaba.com,0
3539697,ethihad,344,www.etihad.com,0
2324566,pretzel,396,www.pretzelshopexample12345.com,1

因此,我想知道如果new.csv中存在较新的数据,如何使用pandas基于id合并两个csv以替换整行,同时将其余行保留在old.csv中?提前感谢您在这方面的帮助


Tags: csv数据comiddefaulturlnewwww
2条回答

这将是我的第一个StackOverflow响应,因此可能会出现更漂亮的解决方案;)。。。但在此之前,我的方法是有效的:

import pandas as pd

old_csv = pd.read_csv(r"YourPath\old.csv", index_col="id")
new_csv = pd.read_csv(r"YourPath\new.csv", index_col="id")

updated_csv = pd.DataFrame(columns = new_csv.columns)

old_ids = [x for x in old_csv.index]
new_ids = [x for x in new_csv.index]

for new_id in new_ids:
    for old_id in old_ids:
        if old_id in new_ids:
            updated_csv.loc[old_id, :] = new_csv.loc[old_id, :]
        else: 
            updated_csv.loc[old_id, :] = old_csv.loc[old_id, :]

# Use the following if you want to have the ID as column again:
updated_csv.reset_index(drop=False, inplace=True)
updated_csv.rename(columns={"index":"ID"}, copy=False, inplace=True)

换句话说,我基本上是使用循环来迭代单个客户机ID。我创建了两个列表,其中包括相应的客户机ID和一个新的DataFrame,它的列与以前相同,将使用for循环填充。 因此,如果旧的\u id在新的\u id列表中,脚本将从新的\u csv中提取该id的数据,如果旧的\u id不在,它将从旧的\u csv中提取数据

希望有帮助,期待反馈

这应该起作用:

f1 = f1.set_index('id')
f2 = f2.set_index('id')
f1.update(f2)
f1.reset_index(inplace=True)

输出:

f1:

    id      description listing url                             default
0   2471582 spacex      888.0   www.spacex.com                  0.0
1   3257236 alibaba     875.0   www.alibaba.com                 0.0
2   3539697 ethihad     348.0   www.etihad.com                  0.0
3   2324566 pretzel     396.0   www.pretzelshopexample12345.com 1.0

相关问题 更多 >