【问题标题】:Merge Two CSV Files With Cases Using Python使用 Python 将两个 CSV 文件与案例合并
【发布时间】:2019-12-21 06:13:38
【问题描述】:

我需要按照流程中的一些规则将两个数据文件合并在一起。我稍微了解如何使用 pandas 来创建和合并 csv,但我不知道如何遵循某些规则。

我有两个文件作为示例:

actual_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
.       .           .           .            .
.       .           .           .            .
.       .           .           .            .

我需要按照以下规则合并这些文件:

  1. 将 actual_data.csv 与 forecast_data.csv 合并
  2. 如果 actual_data.csv 的日期缺失,请使用 forecast_data.csv 作为该日期
  3. 当两者都适用于该特定月份时,始终使用 actual_data.csv 而不是 forecast_data.csv

【问题讨论】:

    标签: python pandas csv merge


    【解决方案1】:

    您需要将实际数据与预测数据进行左连接(这基于您需要填充缺失的实际数据的要求,如果您希望缺失预测数据,则需要进行外连接)。

    import pandas as pd
    
    act_df = pd.read_csv(actual_data.csv)
    fore_df = pd.read_csv(forecast_data.csv)
    
    res = fore_df.merge(act_df, on=['type', 'region_1', 'region_2'], how='left', suffixes=('_fore', '_act'))
    

    此时 res 将具有合并列 ['type', region_1', region_2']、2 个日期列(date_foredate_act)和 2 个数据列(data_foredate_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)
    

    【讨论】:

      【解决方案2】:
      • 一种解决方案是使用 pandas combine_first
      • 这里我假设两个数据框的形状相同。
      • 这里我优先考虑所有列。
      • 您可以循环遍历要从第一个 df 中选择的列。
      • 这里是一个小例子,说明如何实现类似的。
      import numpy as np
      import pandas as pd
      
      df1 = pd.DataFrame({'a':[1,2,np.nan], 'b':['x','y','z']})
      df2 = pd.DataFrame({'a':[1,3,4], 'b':['a','b','c']})
      df = pd.DataFrame()
      for col in df1.columns:
          df[col] = df1[col].combine_first(df2[col])
      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
      

      【讨论】:

        猜你喜欢
        • 2013-04-22
        • 2020-11-22
        • 2020-08-22
        • 2020-03-18
        • 2012-08-12
        • 2019-02-22
        • 1970-01-01
        • 2019-03-27
        • 1970-01-01
        相关资源
        最近更新 更多