簡體   English   中英

使用Python合並兩個CSV文件

[英]Merge Two CSV Files With Cases Using Python

我需要按照流程中的一些規則將兩個數據文件合並在一起。 我稍微知道如何使用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

您需要在實際預測中進行左連接(這是基於您的要求,即如果您希望缺少預測數據,則需要填充缺少的實際數據,以進行外部連接)。

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 )的date_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)
  • 一種解決方案是使用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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM