2017-08-11 108 views
1

我很新的python,並有以下問題。我有一個csv文件,它有4列。我通過閱讀csv文件將數據存入數據框。我想比較日期1和日期2,並從日期2填寫date1中的缺失值。另外,值也從值2到值1。熊貓4列表比較

我有一個CSV文件看起來像下面這樣:

Date 1;Values 1;Date 2;Values 2 
07.08.2017;-0,52;07.08.2017;-0,52 
04.08.2017;-1,30;04.08.2017;-1,3 
03.08.2017;-0,40;03.08.2017;-0,3995 
02.08.2017;-0,43;02.08.2017;-0,4285 
01.08.2017;-0,46;01.08.2017;-0,46 
31.07.2017;-0,48;31.07.2017;-0,3625 
27.07.2017;-0,42;28.07.2017;-1,25 
26.07.2017;-0,42;27.07.2017;-0,41 
25.07.2017;-0,41;26.07.2017;-0,415 
24.07.2017;-0,40;25.07.2017;-0,4085 
21.07.2017;-1,31;24.07.2017;-0,4 

我試圖代碼爲以下但不是成功的,我收到一條錯誤消息:

KeyError: 'Date 1'

的代碼如下所示如下:

import numpy as np 
import pandas as pd 

csv_loader = pd.read_csv('File1.csv', encoding='cp1252', sep=';', index_col=0).dropna() 
csv_loader.reset_index() 
print(csv_loader) 
print("-----------------------------------------------") 

test = set(csv_loader["Date 1"]).intersection(csv_loader["Date 2"]) 

輸出應如下所示:

Date 1  Values 1 Date 2  Values 2         
07.08.2017 -0,52  07.08.2017 -0,52 
04.08.2017 -1,30  04.08.2017 -1,3 
03.08.2017 -0,40  03.08.2017 -0,3995 
02.08.2017 -0,43  02.08.2017 -0,4285 
01.08.2017 -0,46  01.08.2017 -0,46 
31.07.2017 -0,48  31.07.2017 -0,3625 
28.07.2017 -1,25  28.07.2017 -1,25 
27.07.2017 -0,41  27.07.2017 -0,41 
26.07.2017 -0,42  26.07.2017 -0,415 
25.07.2017 -0,41  25.07.2017 -0,4085 
24.07.2017 -0,40  24.07.2017 -0,4 
21.07.2017 -1,31  21.07.2017 -1,31 
+0

能否請你澄清你的問題多一點? – Canis

+0

@canis,從你身邊不清楚什麼? – JonDoe

回答

2

通過執行outer-merge,您可以接近所需的結果。然後使用AMC's idea,叫combine_first填補丟失的數據:

import pandas as pd 

csv_loader = pd.read_csv('File1.csv', encoding='cp1252', sep=';') 
df1 = csv_loader[['Date 1', 'Values 1']] 
df2 = csv_loader[['Date 2', 'Values 2']] 
result = pd.merge(df1, df2, left_on='Date 1', right_on='Date 2', how='outer') 
mask = pd.isnull(result[['Date 1', 'Date 2']]) 

for col in ['Date', 'Values']: 
    a, b = '{} 1'.format(col), '{} 2'.format(col) 
    result[a] = result[a].combine_first(result[b]) 
    result[b] = result[b].combine_first(result[a]) 
print(result) 

missing = {col:result.loc[mask[col], col] for col in mask} 
for col in missing: 
    print('missing from {}:\n{}'.format(col, missing[col])) 

產生

 Date 1 Values 1  Date 2 Values 2 
0 07.08.2017 -0,52 07.08.2017 -0,52 
1 04.08.2017 -1,30 04.08.2017  -1,3 
2 03.08.2017 -0,40 03.08.2017 -0,3995 
3 02.08.2017 -0,43 02.08.2017 -0,4285 
4 01.08.2017 -0,46 01.08.2017 -0,46 
5 31.07.2017 -0,48 31.07.2017 -0,3625 
6 27.07.2017 -0,42 27.07.2017 -0,41 
7 26.07.2017 -0,42 26.07.2017 -0,415 
8 25.07.2017 -0,41 25.07.2017 -0,4085 
9 24.07.2017 -0,40 24.07.2017  -0,4 
10 21.07.2017 -1,31 21.07.2017 -1,31 
11 28.07.2017 -1,25 28.07.2017 -1,25 

missing from Date 2: 
10 21.07.2017 
Name: Date 2, dtype: object 
missing from Date 1: 
11 28.07.2017 
Name: Date 1, dtype: object 

注意index_col=0導致read_csv,使第一列的索引。 因此Date 1成爲索引的名稱,而不是DataFrame的列。 注意如何Date 1出現在一個行本身,下面的列名:

In [67]: csv_loader 
Out[67]: 
      Values 1  Date 2 Values 2 
Date 1         
07.08.2017 -0,52 07.08.2017 -0,52 
04.08.2017 -1,30 04.08.2017  -1,3 
... 

離開Date 1爲一列,刪除index_col=0

+0

非常感謝您的回答。但不知何故,我意識到用我的代碼我沒有收到我想要的解決方案。你看到它嗎? – JonDoe

+0

酷,這是我一直在尋找。還有一個問題。是否有可能獲得一個單獨的數據框,顯示在新數據框中丟失爲兩列的日期1和日期2?這會很有幫助。謝謝。 – JonDoe

+0

您可以使用'mask = pd.isnull(result [['Date 1','Date 2']])'來記錄哪些日期丟失。在填寫缺失的日期之前做到這一點:)然後,在缺少日期填入之後,您可以使用'result.loc [mask [col],col]'檢索缺失的日期。我編輯了上面的代碼以顯示我的意思。 – unutbu

1

你需要刪除的另一件事是dropna()函數。目前您正在刪除空白的所有行。

然後,您可以使用此:

csv_loader["combined_date"] = csv_loader["Date 1"].combine_first(csv_loader["Date 2"]) 

這將創建一個新的列,combined_date,它具有從日期1日期從2所有值和任何值輸入到日期從1

空白

我不知道你怎麼DF看起來像毛坯,但類似:

Date 1   Date 2  combined_date 
08.08.2017  08.17.2017  08.08.2017 
    nan   02.02.2017  02.02.2017 
+0

這就是我正在尋找的東西。但是,我還需要填寫該日期的值從2到值1。另外,我可以在單獨的專欄中填寫缺少的日期嗎? – JonDoe

+0

對於值2和值1,您需要執行相同的操作,只需調整列名稱即可(例如,日期1 - >值1)。至於寫缺失的日期,你可以,但我不明白這將是有用的,因爲如果你創建一個新的列與合併日期/價值,你會保持日期1和值1,這將有空值。如果你想用空值創建一個新的DF,你可以這樣做: new_df = csv_loader [csv_loader.isnull()] – AMC