2013-08-24 61 views
5

出於某種原因,我無法使此合併正常工作。在Pandas中合併數據幀

此數據框(rspars)有2000點以上的行...

rsparid f1mult f2mult f3mult 
0  1 0.318 0.636 0.810 
1  2 0.348 0.703 0.893 
2  3 0.384 0.777 0.000 
3  4 0.296 0.590 0.911 
4  5 0.231 0.458 0.690 
5  6 0.275 0.546 0.839 
6  7 0.248 0.486 0.731 
7  8 0.430 0.873 0.000 
8  9 0.221 0.438 0.655 
9  11 0.204 0.399 0.593 

當試圖加入以上基礎上,rsparid列該數據幀的表...

  line_track line_race rsparid 
line_date        
2013-03-23   TP   10 1400 
2013-02-23   GP   7  634 
2013-01-01   GP   7 1508 
2012-11-11  AQU   5  96 
2012-10-11  BEL   2  161 

使用此...

df = pd.merge(datalines, rspars, how='left', on='rsparid') 

我得到空白..

line_track line_race rsparid f1mult f2mult f3mult 
0   TP   10 1400  NaN  NaN  NaN 
1   TP   10 1400  NaN  NaN  NaN 
2   TP   10 1400  NaN  NaN  NaN 
3   GP   7  634  NaN  NaN  NaN 
4   GP   10  634  NaN  NaN  NaN 

請注意,「datalines」列可以有比rspars多數千行,因此是左連接。我一定做錯了什麼?

我也嘗試了這種方式...

df = datalines.merge(rspars, how='left', on='rsparid') 

例2

我放棄了數據下降到幾行...

rspars:

rsparid f1mult f2mult f3mult 
0  1400 0.216 0.435 0.656 

datalines:

rsparid 
0 1400 
1  634 
2 1508 
3  96 
4  161 
5 1011 
6 1007 
7  518 
8 1955 
9  678 

合併...

datalines.merge(rspars, how='left', on='rsparid') 

輸出...

rsparid f1mult f2mult f3mult 
0 1400  NaN  NaN  NaN 
1  634  NaN  NaN  NaN 
2 1508  NaN  NaN  NaN 
3  96  NaN  NaN  NaN 
4  161  NaN  NaN  NaN 
5 1011  NaN  NaN  NaN 
6 1007  NaN  NaN  NaN 
7  518  NaN  NaN  NaN 
8 1955  NaN  NaN  NaN 
9  678  NaN  NaN  NaN 
+0

你可以顯示一點'datalines'嗎? –

+0

第一個顯示的Dataframe是rspars。數據表有幾十個字段,其中之一是rsparid。 – TravisVOX

+0

爲了清晰起見,我添加了一些更多信息。 – TravisVOX

回答

4

NaN什麼惡意,他們有共同的rsparid沒有值。合併的事情,可能看起來是一樣的時候,當他們repr

的小DataFrames有(整數的)串或整數再版看起來是一樣的,當幀小不dtype信息打印這可能會非常棘手。通過調用DataFrame.info()方法,您可以獲得小框架的這些信息(以及更多),如下所示:df.info()。這會給你一個什麼樣的在DataFrame一個很好的總結,什麼dtype開發它列是:

In [205]: datalines_int = DataFrame({'rsparid':[1400,634,1508,96,161,1011,1007,518,1955,678]}) 

In [206]: datalines_str = DataFrame({'rsparid':map(str,[1400,634,1508,96,161,1011,1007,518,1955,678])}) 

In [207]: datalines_int 
Out[207]: 
    rsparid 
0  1400 
1  634 
2  1508 
3  96 
4  161 
5  1011 
6  1007 
7  518 
8  1955 
9  678 

In [208]: datalines_str 
Out[208]: 
    rsparid 
0 1400 
1  634 
2 1508 
3  96 
4  161 
5 1011 
6 1007 
7  518 
8 1955 
9  678 

In [209]: datalines_int.info() 
<class 'pandas.core.frame.DataFrame'> 
Int64Index: 10 entries, 0 to 9 
Data columns (total 1 columns): 
rsparid 10 non-null values 
dtypes: int64(1) 

In [210]: datalines_str.info() 
<class 'pandas.core.frame.DataFrame'> 
Int64Index: 10 entries, 0 to 9 
Data columns (total 1 columns): 
rsparid 10 non-null values 
dtypes: object(1) 

注:你,最有可能在這裏發現的repr輕微差異由於填充數字DataFrame s。要點是,除非他們專門尋找差異,否則沒有人真的能夠看到使用交互式交互方式。

+0

我剛剛添加到示例如何索引rspar表來顯示rsparid確實存在。它通過'read_csv'直接從一個CSV文件中獲得,而且它的rsparid肯定在那裏。 – TravisVOX

+0

我認爲你誤解了merge。如果'datalines.rsparid'中沒有* values *,它們與'rspars.rsparid'中的值相等,那麼你將得到'NaN's,因爲沒有任何東西可以加入。 –

+0

嘿,如果你看看我的第二個例子,我把數據減少到只有那裏,我仍然有問題。 – TravisVOX