使用Python将两个CSV文件与案例合并

使用Python将两个CSV文件与案例合并,python,pandas,csv,merge,Python,Pandas,Csv,Merge,在此过程中,我需要按照一些规则将两个数据文件合并在一起。我对如何使用pandas创建和合并csv略知一二,但我不知道如何遵循某些规则 例如,我有两个文件: 实际_data.csv type region_1 region_2 date data aw west 2 10/01/2017 0.9318274971234 hss east 3 05/12/2015 0.71

在此过程中,我需要按照一些规则将两个数据文件合并在一起。我对如何使用pandas创建和合并csv略知一二,但我不知道如何遵循某些规则

例如,我有两个文件:

实际_data.csv

type    region_1    region_2    date         data
aw      west        2           10/01/2017   0.9318274971234
hss     east        3           05/12/2015   0.7136487234972
.       .           .           .            .
.       .           .           .            .
.       .           .           .            .
forecast_data.csv

type    region_1    region_2    date         data
jad     north       22          11/13/2025   0.71283741932
js      east        3           04/16/2023   0.16238471239
.       .           .           .            .
.       .           .           .            .
.       .           .           .            .
我需要按照以下规则合并这些文件:

  • 将实际_data.csv与预测_data.csv合并
  • 如果缺少actual_data.csv的日期,请使用forecast_data.csv作为该日期
  • 当两种数据均适用于特定月份时,始终使用实际的_data.csv而不是预测的_data.csv
    • 一种解决方案是先使用pandas
      组合
    • 这里我假设两个数据帧的形状相同
    • 在这里,我优先考虑所有的专栏
    • 可以在要从第一个df中拾取的列上循环
    • 下面是一个小例子,说明如何实现类似的目标
    输出:

    # df1
          a     b
    0   1.0     x
    1   2.0     y
    2   NaN     z
    
    #df2
        a   b
    0   1   a
    1   3   b
    2   4   c
    
    #df
        a       b
    0   1.0     x
    1   2.0     y
    2   4.0     z
    
    • 参考

    您需要将实际数据与预测数据进行左连接(这是基于您的要求,即缺少的实际数据应该被填充,如果您希望缺少预测数据,则需要进行外部连接)

    此时,res将有一个合并列的索引
    ['type',region\u 1',region\u 2']
    ,2个日期列(
    date\u-fore
    date\u-act
    ),和2个数据列(
    data\u-fore
    date\u-act
    )。从那里,您可以用预测日期填充实际日期的空值,然后根据需要将其折叠为一列:

    res['date'] = res['date_act'].fillna(res['date_fore'])
    res.drop(['date_fore', 'date_act'], axis=1, inplace=True)
    
    对于数据,这是一个类似的操作:

    res['data'] = res['data_act'].fillna(res['data_fore'])
    res.drop(['data_fore', 'data_act'], axis=1, inplace=True)
    
    res['date'] = res['date_act'].fillna(res['date_fore'])
    res.drop(['date_fore', 'date_act'], axis=1, inplace=True)
    
    res['data'] = res['data_act'].fillna(res['data_fore'])
    res.drop(['data_fore', 'data_act'], axis=1, inplace=True)