2013-08-24 44 views
5

Per qualche motivo, non riesco a far funzionare correttamente questa unione.Dataframe Unisci in Panda

Questo dataframe (rspars) ha 2.000 + righe ...

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 

Quando si tenta di aderire sopra a una tabella in base al rsparid colonne a questo dataframe ...

  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 

l'utilizzo di questo ...

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

ottengo vuoti ..

0.123.516,410617 millions
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 

Nota, la colonna "datalines" può avere migliaia di righe in più rispetto alle rspars, quindi la join sinistra. Devo fare qualcosa di sbagliato?

Ho anche provato in questo modo ...

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

ESEMPIO # 2

ho lasciato cadere i dati fino a un paio di righe ...

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 

Unione ...

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

uscita ...

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

Puoi mostrare un po 'di dataline? –

+0

Il primo Dataframe mostrato è rspars. La tabella datalines contiene dozzine di campi, uno dei quali è rsparid. – TravisVOX

+0

Ho aggiunto ulteriori informazioni per maggiore chiarezza. – TravisVOX

risposta

4

I NaN s significa che essi hanno alcun valore in rsparid in comune. Questo può essere difficile quando si uniscono le cose che possono sembrare lo stesso quando hanno repr

La repr di piccola DataFrames con le stringhe (di numeri interi) o interi sembra lo stesso e non dtype verranno stampati quando i frame sono piccole. È possibile ottenere questa informazione (e altro) per cornici piccole chiamando il metodo DataFrame.info(), in questo modo: df.info(). Questo vi darà un bel riassunto di ciò che è nel DataFrame e quali sono le dtype s delle sue colonne sono:

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) 

NOTA: Si noterà una leggera differenza nelle repr s qui, molto probabilmente a causa del padding di numerico DataFrame s. Il punto è che nessuno sarebbe davvero in grado di vederlo usando questo in modo interattivo, a meno che non stessero cercando specificamente la differenza.

+0

Ho appena aggiunto all'esempio come ho indicizzato la tabella rspar per mostrare che rsparid esiste. Arriva direttamente da un file CSV tramite 'read_csv' ed è proprio quello di rsparid. – TravisVOX

+0

Penso che tu stia fraintendendo l'unione. Se non ci sono * valori * in 'datalines.rsparid' che sono uguali ai valori in' rspars.rsparid' allora otterrai 'NaN's perché non c'è nulla su cui partecipare. –

+0

Ehi, se verifichi il mio secondo esempio, in cui ho ridotto i dati solo a ciò che è presente, sto ancora avendo il problema. – TravisVOX