2014-02-05 51 views
2

我正在使用500赫茲取樣的眼睛跟蹤器,因此我每2毫秒測量一次。我已經加載這個數據到數據幀,並隨着時間的樣本重新索引它,這樣我行的索引匹配的時間,以毫秒爲單位,在記錄時所:如何將一個數據框合併到另一個數據框中,插入不存在的行?

下面是該數據幀的切片(注意:event列包含空字符串現在):

  x  y  cr event 
2000 109.9 1133.7 4264.0  
2001 109.0 1133.3 4267.0  
2002 107.1 1130.6 4269.0  
2003 104.3 1128.0 4270.0  
2004 97.8 1125.2 4268.0  
2005 89.8 1124.3 4266.0  
2006 79.2 1121.3 4274.0  
2007 69.5 1118.7 4284.0  
2008 59.6 1116.7 4293.0  
2009 53.0 1116.9 4291.0  
2010 48.6 1117.1 4290.0 

正如你所看到的,有沒有奇數時間索引,再次,因爲機器的樣品每2毫秒。

我的第二個DataFrame跟蹤發送給eyetracker的TTL。這些TTL可以在毫秒分辨率的任何時間發生,所以在這裏可以是是奇數時間戳。這第二個DataFrame有兩列,tmsg。這裏有一個片段:

 t   msg 
0 11911 WarningOnset 
1 12510  CueOnset 
2 14693 WarningOnset 
3 17009 WarningOnset 
4 17642  CueOnset 

我的目標是第二個數據幀合併到第一,使得dataframe2的msg列中每個項目被放入dataframe1的event列由t欄表示的指數。

這意味着我在dataframe1中的一些索引目前還不存在,這就是爲什麼我目前的方法與KeyError失敗。

這裏是我的嘗試:

samples.loc[events['t'], 'event'] = events['msg'] # throws KeyError 

什麼是這樣做的正確方法是什麼?爲了清楚起見,我想要將NaN s放在dataframe2中不存在的列中(即上面示例中的events)。

+0

你看過'join'方法嗎? – BrenBarn

+0

@BrenBarn,我現在看,謝謝! (如果可能的話,一個例子仍然是受歡迎的) – blz

+0

您是否嘗試過'df。合併(df1,on ='t',how ='left')',假設df是你的第一個數據幀,df1是你的第二個 – EdChum

回答

1

您最初嘗試失敗的原因是這些值不存在於您的目標數據框中,您想要執行的是將事件分配給存在匹配並將事件設置爲NaN或空白的地方或者沒有任何地方真實的事件。

你想要做的就是將其他df合併到你的第一個索引(它應該代表相同的事物)或列應該代表相同的事情。

您還需要在第二個df中重命名您的列。

那麼重命名列:

df1.rename({'msg':'event'}) 

現在設置欄 'T' 來作爲你的索引

df1.set_index(['t'],inplace=True) 

現在合併:

df.merge(df1, left_index=True, right_index=True, how='left') 

您還可以使用結合第一其保留左側數據幀數據:

df.combine_first(df1) 
相關問題