2015-09-03 58 views
0

我正在努力正確合併熊貓中的幾個數據集。假設我在不同的時間測量了變量A,B和C.有時,我同時有A和B,有時候不會。我有三個數據幀,其中數據幀的索引是測量時間,還有一個測量列。如果我串連這些dataframes,我收到了一堆的NaN,我沒有測量,可能像在熊貓中合併多個數據集

idx | A | B | C 
-----|-----|-----|---- 
    0 | 1 | NaN | NaN 
    0 | NaN | 2 | 3 
    1 | 5 | 3 | NaN 

在串聯,我非唯一索引的時間。我想要的是按時間排序,並用相同的時間索引合併行。這裏的理想結果是

idx | A | B | C 
-----|-----|-----|---- 
    0 | 1 | 2 | 3 
    1 | 5 | 3 | NaN 

這將是第一種情況。爲了使事情更加複雜,我可能會有一個列D,它指定了測量的位置。因此,只要D中的條目與當時不同,我就需要允許這種摺疊保持非唯一索引。也許我們有

idx | A | B | C | D 
-----|-----|-----|-----|----- 
    0 | 1 | NaN | NaN | Paris 
    0 | NaN | 2 | 3 | NYC 
    1 | 5 | 3 | NaN | NYC 
    1 | NaN | NaN | 0 | Paris 

該數據幀不能被任何進一步的崩潰,因爲,d條件,它已經得到了獨特的時間和信息的倒塌成爲可能。

我仍然試圖讓我的腦袋圍繞着各種join/merge/concat操作以及它們是如何工作的,但是我會喜歡一兩個指針。

謝謝!

+0

這不是類似:http://stackoverflow.com/questions/32378308/drop-nan-cells-and-move-non-null-values-according-to-datetime-index?所以'df.groupby('idx')。sum()'應該做你想做的事情? – EdChum

+0

@EdChum:如果我按位置分組,然後sum(),我失去了時間序列。按位置分組會生成索引爲位置的數據幀。如果我將測量時間設置爲列和組,則不能總結位置(因爲它們是字符串),所以我會丟失該列。 – Quentin

+0

爲A,B,C和D中的每一個創建一個索引爲'timestamp'和列'var_name','val'的數據框,從這裏創建concat,sort和unstack。 – acushner

回答

0

假設您的索引是時間戳,請嘗試以您想要的頻率(例如每小時,每天,每週等)嘗試resample。如果在窗口中觀察到多個樣本,則可以進行平均測量。

df = pd.DataFrame({'A': {Timestamp('2015-01-01 11:30:00'): 1.0, 
    Timestamp('2015-01-01 12:30:00'): nan, 
    Timestamp('2015-01-02 11:15:00'): 5.0, 
    Timestamp('2015-01-02 12:15:00'): nan}, 
'B': {Timestamp('2015-01-01 11:30:00'): nan, 
    Timestamp('2015-01-01 12:30:00'): 2.0, 
    Timestamp('2015-01-02 11:15:00'): 3.0, 
    Timestamp('2015-01-02 12:15:00'): nan}, 
'C': {Timestamp('2015-01-01 11:30:00'): nan, 
    Timestamp('2015-01-01 12:30:00'): 3.0, 
    Timestamp('2015-01-02 11:15:00'): nan, 
    Timestamp('2015-01-02 12:15:00'): 0.0}, 
'D': {Timestamp('2015-01-01 11:30:00'): 'Paris', 
    Timestamp('2015-01-01 12:30:00'): 'NYC', 
    Timestamp('2015-01-02 11:15:00'): 'NYC', 
    Timestamp('2015-01-02 12:15:00'): 'Paris'}}) 

>>> df 
         A B C  D 
2015-01-01 11:30:00 1 NaN NaN Paris 
2015-01-01 12:30:00 NaN 2 3 NYC 
2015-01-02 11:15:00 5 3 NaN NYC 
2015-01-02 12:15:00 NaN NaN 0 Paris 

>>> df.resample('1D', how='mean') 
      A B C 
2015-01-01 1 2 3 
2015-01-02 5 3 0 

爲了說明觀察點,您需要將其作爲多索引列。一個簡單的方法是按日期和地點(D列)進行分組,然後拆堆。

>>> df.reset_index().groupby(['index', 'D']).mean().unstack().resample('1D', how='mean') 
       A   B   C  
D   NYC Paris NYC Paris NYC Paris 
index           
2015-01-01 NaN  1 2 NaN 3 NaN 
2015-01-02 5 NaN 3 NaN NaN  0