【问题标题】:Move data of a column to another csv file if 4 columns on both csv files are matched如果两个 csv 文件上的 4 列都匹配,则将列的数据移动到另一个 csv 文件
【发布时间】:2021-08-18 07:36:31
【问题描述】:

我目前正在处理 2 个 csv 文件,其中 1 包含 5 列 - 年、月、日、小时和收入,我想将收入列转录到另一个 csv 文件,该文件也有年、月、日、和小时列。例如,我想在第二个 csv 文件中添加一个“收入”列,并将 2020/05/26 17:00 的收入值放在第一个 csv 的收入列中,日期和时间相同。

第一个 csv 示例

year, month, day, hour, revenue
2020,3,5,8,100
2020,3,5,9,100
2020,3,5,11,100

第二个 csv 示例

year, month, day, hour, revenue
2020,3,5,8,
2020,3,5,9,
2020,3,5,10,
2020,3,5,11,
2020,3,5,12,

我想要得到的结果 csv

year, month, day, hour, revenue
2020,3,5,8,100
2020,3,5,9,100
2020,3,5,10,
2020,3,5,11,100
2020,3,5,12,

我检查了Pandas Merging 101,但它是在谈论 1 列何时匹配,而我正在检查是否所有 4 列都匹配。此外,这将是一个大约 10,000 行的大型 csv。

提前谢谢你。

【问题讨论】:

    标签: python pandas csv


    【解决方案1】:

    mergeon 参数可以取列列表:

    df3 = df1.merge(df2, on=['year', 'month', 'day', 'hour'], how='right')
    

    merge 的默认行为是在“两个 DataFrame 中列的交叉点”上进行合并,因此在这种特殊情况下,默认合并是等效的:

    df3 = df1.merge(df2, how='right')
    

    如果df2 有一个名为收入的列,但没有有意义的值,则在合并之前删除该列:

    df3 = df1.merge(df2.drop(columns='revenue'), how='right')
    

    df3:

       year  month  day  hour  revenue
    0  2020      3    5     8    100.0
    1  2020      3    5     9    100.0
    2  2020      3    5    10      NaN
    3  2020      3    5    11    100.0
    4  2020      3    5    12      NaN
    

    使用to_csv将结果写入csv:

    df1.merge(df2, how='right').to_csv('out.csv', index=False)
    

    out.csv:

    year,month,day,hour,revenue
    2020,3,5,8,100.0
    2020,3,5,9,100.0
    2020,3,5,10,
    2020,3,5,11,100.0
    2020,3,5,12,
    

    完整的工作示例:
    import numpy as np
    import pandas as pd
    
    df1 = pd.DataFrame({
        'year': [2020, 2020, 2020], 'month': [3, 3, 3], 'day': [5, 5, 5],
        'hour': [8, 9, 11], 'revenue': [100, 100, 100]
    })
    
    df2 = pd.DataFrame({
        'year': [2020, 2020, 2020, 2020, 2020], 'month': [3, 3, 3, 3, 3],
        'day': [5, 5, 5, 5, 5], 'hour': [8, 9, 10, 11, 12],
        'revenue': [np.nan, np.nan, np.nan, np.nan, np.nan]
    })
    
    df1.merge(df2.drop(columns='revenue'), how='right') \
        .to_csv('out.csv', index=False)
    

    【讨论】:

    • 哦,我明白了!非常感谢。
    • 关于原始数据的呈现方式,第二个 CSV 也有一个名为“收入”的列,其中包含所有空白值。如果将此列拉入数据框中,则结果会有所不同,分别具有单独的“revenue_x”和“revenue_y”列(默认情况下,pandas 将它们称为)。其中一个是来自 df1 的“收入”,另一个是来自 df2 的“收入”。这个答案有 df2 根本没有收入列,这解决了这个问题。如果收入的 df2 始终为空,那么 read_csv 就不必引入该列。
    猜你喜欢
    • 1970-01-01
    • 2018-04-07
    • 2020-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多