2013-08-24 3 views
5

なんらかの理由で、このマージが正しく機能しません。パンダのデータフレームマージ

このDATAFRAMEへrsparid列に基づいてテーブルに上記に参加しようとすると、このデータフレーム(rspars)は2,000+行...

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 

を持っている...

  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よりも何千も多くの行が存在する可能性があることに注意してください。私は何か間違っている必要がありますか?私はいくつかの行までのデータを落とした2

私もそれをこのように試してみました...

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

例#...

rspars:

rsparid f1mult f2mult f3mult 
0  1400 0.216 0.435 0.656 

データライン:

...

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

出力をマージ

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

...

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

「データライン」を少し表示できますか? –

+0

最初に示されたデータフレームはrsparsです。 datalinesテーブルには数十のフィールドがあり、そのうちの1つはrsparidです。 – TravisVOX

+0

私は分かりやすくするためにいくつかの情報を追加しました。 – TravisVOX

答えて

4

NaNのは、彼らが共通してrsparidで値を持たない意味。彼らは

(整数の)文字列または整数と小さなDataFramesののreprが同じに見えるreprやフレームが小さいとき何dtype情報が印刷されていないときと同じように見えることがあり、物事をマージするときに注意が必要です。 DataFrame.info()メソッドを呼び出すことで、小さなフレームの情報を取得できます(df.info()など)。

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に何の概要とその列のdtype sが何であるかを与えます数値DataFrameのパディングのためです。ポイントは、誰も本当に違いを探していない限り、これを対話的に使ってみることは誰も見ることができません。

+0

rsparidが存在することを示すためにrsparテーブルをどのように索引付けしたかを例に追加しました。それはCSVファイルから 'read_csv'を介してまっすぐに来ています。それはrsparidのものです。 – TravisVOX

+0

私はあなたが「合併」を誤解していると思います。 'datalines.rsparid'に' rspars.rsparid'の値と等しい*値*がない場合は、何も結合しないので 'NaN'を取得します。 –

+0

二番目の例をチェックして、データをそこにあるものに減らした場合、私はまだ問題が残っています。 – TravisVOX