【问题标题】:How to compare 2 csv and write result to new csv using pandas如何使用 pandas 比较 2 个 csv 并将结果写入新的 csv
【发布时间】:2022-01-26 14:04:15
【问题描述】:

我想比较源文件和目标文件的 sku,如果目标 sku 与源文件匹配,我想复制该行的 meta_title、meta_description 和 description

import pandas as pd

source = pd.read_csv('/content/source-source.csv')
destination = pd.read_csv('/content/out.csv')

for i in range(0, len(source)):
    try: 
        source_sku = source.iloc[i]['sku']
        destination_sku = destination.iloc[i]['sku']

        source_meta_title = source.iloc[i]['meta_title']
        source_meta_description = source.iloc[i]['meta_description']
        source_description = source.iloc[i]['description']

        if source_sku == destination_sku:
            destination.loc[i, 'meta_title'] = source_meta_title
            destination.loc[i, 'meta_description'] = source_meta_description
            destination.loc[i, 'description'] = source_description
         
        destination.to_csv('merged.csv', index=False, encoding='utf-8-sig')
    except ValueError:
        break

source.csv

sku meta_title meta_description description
a    ab         ab               ab
b    bb         bb               bb

destination.csv

sku meta_title meta_description description
a    bb         bb               bb
b    ab         ab               ab

合并的.csv

sku meta_title meta_description description
a    ab         ab               ab
b    bb         bb               bb

我的代码现在可以运行了,但是如果更改的行数增加,那么它会抛出错误

【问题讨论】:

    标签: python python-3.x pandas csv


    【解决方案1】:

    我想这就是你想要的。它保留来自目标的 SKU 集并替换也在源中的 SKU 的值。

    import pandas as pd
    
    source = pd.read_csv('/content/source-source.csv')
    destination = pd.read_csv('/content/out.csv')
    
    destination = destination.merge(
        source,
        how='left',
        on=['sku'],
        suffixes=('_old', ''),
    )
    
    value_cols = ['meta_title', 'meta_description', 'description']
    
    for c in value_cols:
        destination[c] = destination[c].fillna(destination[f'{c}_old'])
    
    destination = destination.drop(columns=[
        f'{c}_old'
        for c
        in value_cols
    ])
    
    destination.to_csv('merged.csv', index=False, encoding='utf-8-sig')
    

    【讨论】:

    • 实际上我不需要后缀,我需要将它从源 csv 替换为目标 csv
    • 你试过运行它吗?后缀只是创建一个临时列。在写入输出之前,带有后缀的列会被删除。
    • 是累了,但是代码删除了目标csv的多余行,因为源csv有3640行,目标有3662行,但结果有3640行
    • 如果您有一个重现该问题的小示例,我可以看一下,但这似乎很奇怪。它在目标上进行左连接,因此输出数据帧中的行数应该至少与目标数据帧中的行数一样多。
    【解决方案2】:

    如果在合并数据集中,您希望将目标和源中的行保留为 ['sku'] 中的不同值,您可以尝试这样做

    import pandas as pd
    
    source = pd.DataFrame({'sku':['a','b', 'c'], 'meta_title':['ab','bb', 'ac'], 'meta_description':['ab','bb', 'ac'], 'description':['ab','bb', 'ac']})
    destination = pd.DataFrame({'sku':['a','b', 'd'], 'meta_title':['bb','ab', 'dd'], 'meta_description':['bb','ab', 'dd'], 'description':['bb','ab', 'dd']})
    
    df = source.merge(destination, how='outer', on='sku', indicator=True, suffixes=['', '_2'])
    
    cols = ['sku', 'meta_title', 'meta_description', 'description', '_merge']
    
    df = df[cols].loc[df['sku'].drop_duplicates().index].reset_index(drop=True)
    
    
    # To check only rows with the same SKUs
    df[df['_merge']=='both']
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-19
      • 1970-01-01
      • 2019-04-18
      • 2020-03-16
      • 2014-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多