2014-06-10 84 views
2

我在兩個單獨的DataFrame列中有時間系列數據,它們指的是相同的參數但長度不同。將來自兩個數據幀列的數據合併爲一列

在數據只存在於一列中的日期上,我希望將此值放在我的新列中。在有兩列的條目的日期,我想要有平均值。 (我想加入使用索引,這是一個日期時間值)

有人可以建議一種方法,我可以結合我的兩列?謝謝。編輯2:我寫了一些代碼,它應該合併我的列中的數據,但是當我嘗試使用由我的第一個df具有值但第二個df的行生成的索引設置新值時,我得到了一個KeyError沒有。下面的代碼:

def merge_func(df): 
    null_index = df[(df['DOC_mg/L'].isnull() == False) & (df['TOC_mg/L'].isnull() == True)].index 
    df['TOC_mg/L'][null_index] = df[null_index]['DOC_mg/L'] 
    notnull_index = df[(df['DOC_mg/L'].isnull() == True) & (df['TOC_mg/L'].isnull() == False)].index 
    df['DOC_mg/L'][notnull_index] = df[notnull_index]['TOC_mg/L'] 

    df.insert(len(df.columns), 'Mean_mg/L', 0.0) 
    df['Mean_mg/L'] = (df['DOC_mg/L'] + df['TOC_mg/L'])/2 
    return df 

merge_func(sve) 

而這裏的錯誤:

KeyError: "['2004-01-14T01:00:00.000000000+0100' '2004-03-04T01:00:00.000000000+0100'\n '2004-03-30T02:00:00.000000000+0200' '2004-04-12T02:00:00.000000000+0200'\n '2004-04-15T02:00:00.000000000+0200' '2004-04-17T02:00:00.000000000+0200'\n '2004-04-19T02:00:00.000000000+0200' '2004-04-20T02:00:00.000000000+0200'\n '2004-04-22T02:00:00.000000000+0200' '2004-04-26T02:00:00.000000000+0200'\n '2004-04-28T02:00:00.000000000+0200' '2004-04-30T02:00:00.000000000+0200'\n '2004-05-05T02:00:00.000000000+0200' '2004-05-07T02:00:00.000000000+0200'\n '2004-05-10T02:00:00.000000000+0200' '2004-05-13T02:00:00.000000000+0200'\n '2004-05-17T02:00:00.000000000+0200' '2004-05-20T02:00:00.000000000+0200'\n '2004-05-24T02:00:00.000000000+0200' '2004-05-28T02:00:00.000000000+0200'\n '2004-06-04T02:00:00.000000000+0200' '2004-06-10T02:00:00.000000000+0200'\n '2004-08-27T02:00:00.000000000+0200' '2004-10-06T02:00:00.000000000+0200'\n '2004-11-02T01:00:00.000000000+0100' '2004-12-08T01:00:00.000000000+0100'\n '2011-02-21T01:00:00.000000000+0100' '2011-03-21T01:00:00.000000000+0100'\n '2011-04-04T02:00:00.000000000+0200' '2011-04-11T02:00:00.000000000+0200'\n '2011-04-14T02:00:00.000000000+0200' '2011-04-18T02:00:00.000000000+0200'\n '2011-04-21T02:00:00.000000000+0200' '2011-04-25T02:00:00.000000000+0200'\n '2011-05-02T02:00:00.000000000+0200' '2011-05-09T02:00:00.000000000+0200'\n '2011-05-23T02:00:00.000000000+0200' '2011-06-07T02:00:00.000000000+0200'\n '2011-06-21T02:00:00.000000000+0200' '2011-07-04T02:00:00.000000000+0200'\n '2011-07-18T02:00:00.000000000+0200' '2011-08-31T02:00:00.000000000+0200'\n '2011-09-13T02:00:00.000000000+0200' '2011-09-28T02:00:00.000000000+0200'\n '2011-10-10T02:00:00.000000000+0200' '2011-10-25T02:00:00.000000000+0200'\n '2011-11-08T01:00:00.000000000+0100' '2011-11-28T01:00:00.000000000+0100'\n '2011-12-20T01:00:00.000000000+0100' '2012-01-19T01:00:00.000000000+0100'\n '2012-02-14T01:00:00.000000000+0100' '2012-03-13T01:00:00.000000000+0100'\n '2012-03-27T02:00:00.000000000+0200' '2012-04-02T02:00:00.000000000+0200'\n '2012-04-10T02:00:00.000000000+0200' '2012-04-17T02:00:00.000000000+0200'\n '2012-04-26T02:00:00.000000000+0200' '2012-04-30T02:00:00.000000000+0200'\n '2012-05-03T02:00:00.000000000+0200' '2012-05-07T02:00:00.000000000+0200'\n '2012-05-10T02:00:00.000000000+0200' '2012-05-14T02:00:00.000000000+0200'\n '2012-05-22T02:00:00.000000000+0200' '2012-06-05T02:00:00.000000000+0200'\n '2012-06-19T02:00:00.000000000+0200' '2012-07-03T02:00:00.000000000+0200'\n '2012-07-17T02:00:00.000000000+0200' '2012-07-31T02:00:00.000000000+0200'\n '2012-08-14T02:00:00.000000000+0200' '2012-08-28T02:00:00.000000000+0200'\n '2012-09-11T02:00:00.000000000+0200' '2012-09-25T02:00:00.000000000+0200'\n '2012-10-10T02:00:00.000000000+0200' '2012-10-24T02:00:00.000000000+0200'\n '2012-11-21T01:00:00.000000000+0100' '2012-12-18T01:00:00.000000000+0100'] not in index" 
+0

看看這個答案合併[如果你需要添加後綴類似命名列的情況]:「http://stackoverflow.com/questions/23906835/pandas-merging-join-dataframes/23921662#23921662」 ,現在閱讀這裏:「http://pandas.pydata.org/pandas-docs/stable/indexing.html?highlight=loc#indexing-and-selecting-data」瞭解如何選擇某些索引。在合併之後你會想要做什麼,使用df [(df ['colA']。isnull()== True)&(df ['colB']。isnull()= = False)],並設置該值如果丟失。然後取colA和colB的平均值 –

+0

感謝您對@RyanG的評論。我的列已經在同一個'DataFrame'中並且共享一個索引(這是日期時間)。如果兩行都包含值,我寫了一個函數來查找空行/取平均值,但是當我嘗試分配新值時,出現語法錯誤。我已將新代碼添加到原始問題中。 – Bprodz

+0

循環完成後我會返回數據幀。您在實施中密切關注,但在下面的答案中,這是解決此問題的另一種方法。 –

回答

2

你是接近,但你其實並不需要使用ISNULL()函數時,在各行進行迭代。默認情況下

df[(df['DOC_mg/L'].isnull() == False) & (df['TOC_mg/L'].isnull() == True)].index 

會回到那裏DOC_mg/L不是null TOC_mg/L是空行的只是指數。

現在你可以做這樣的事情,爲TOC_mg/L的設定值:

null_index = df[(df['DOC_mg/L'].isnull() == False) & \ 
       (df['TOC_mg/L'].isnull() == True)].index 
df['TOC_mg/L'][null_index] = df['DOC_mg/L'][null_index] # EDIT To switch the index position. 

這將使用其中TOC_mg/L爲空和DOC_mg/L不爲空行的索引,將TOC_mg/L的值設置爲DOC_mg/L中在相同行中找到的值。

注:這不是使用索引設置值接受的方式,但我怎麼一直在做了一段時間。只要確保設置值時,等式的左邊是df['col_name'][index]。如果col_nameindex被切換,您將把這些值設置爲一個永遠不會回到原來的副本。

現在來設置平均值,你可以創建一個新的列,我們將這個稱爲Mean_mg/L並設置值= 0.0。然後,這個新列設置爲兩列的均值:

# Insert a new col at the end of the dataframe columns name 'Mean_mg/L' 
#  with default value 0.0 
df.insert(len(df.columns), 'Mean_mg/L', 0.0) 
# Set this columns value to the average of DOC_mg/L and TOC_mg/L 
df['Mean_mg/L'] = (df['DOC_mg/L'] + df['TOC_mg/L'])/2 

在我們與相應的列值填充空值的列,平均將是相同的值。

+0

感謝您的解決方案。在計算平均值之前,我添加了一條額外的行來將第二個'df'的值複製回1st(我不確定'Pandas'是否會在計算平均值時跳過'NaNs')。我得到一個'KeyError',說'null_index''不在索引中。我不明白爲什麼我得到這個錯誤,因爲用於生成索引的'df'與我正在使用的'df'相同。我誤解了錯誤嗎? – Bprodz

+1

姆米。看來,根據索引設置的方式,你不能使用'df [null_index] ['DOC_mg/L']',而是使用'df ['DOC_mg/L'] [null_index]'。這很有趣,因爲我從來沒有發生過這種事情,但它一定是運氣。我已更新該帖子以包含修復程序。 –

+1

謝謝,這工作。我還發現了一個替代解決方案,使用'.loc'即'df.loc [null_index,'TOC_mg/L'] = df ['DOC_mg/L']' – Bprodz