使用Python合并带有案例的两个CSV文件

时间:2019-08-14 16:45:42

标签: python pandas csv merge

我需要按照过程中的一些规则将两个数据文件合并在一起。我对如何使用熊猫创建和合并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. 当特定月份的两个月份都可用时,总是在预报_数据.csv上使用Actual_data.csv

2 个答案:

答案 0 :(得分:3)

您需要对实际预测进行左连接(基于您的要求,即应填写缺少的实际数据,如果您希望缺少预测数据,则需要进行外部连接)。

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_fore,{ {1}})。在此处,您可以用预测日期填充实际日期的空值,然后根据需要将其折叠到单个列中:

date_act

对于数据,这是类似的操作:

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

答案 1 :(得分:1)

  • 一种解决方案是使用熊猫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