2013-08-24 20 views
5

Z jakiegoś powodu nie mogę uzyskać tego scalenia do poprawnego działania.Dataframe Merge in Pandy

Ten Dataframe (rspars) ma ponad 2.000 wiersze ...

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 

Podczas próby przyłączenia się do tabeli powyżej na podstawie rsparid kolumn do tego 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 

Korzystanie z tej ...

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

uzyskać półfabrykatów ..

Uwaga, kolumna "datallines" może mieć tysiące wierszy więcej niż rspars, a więc lewe sprzężenie. Muszę robić coś nie tak?

Próbowałem też to w ten sposób ...

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

Przykład # 2

rzuciłem dane do kilku rzędach ...

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 

Scalanie ...

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

Wyjście ...

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

Czy możesz pokazać trochę 'datalines'? –

+0

Pierwsza wyświetlana ramka danych to rspars. Tabela dataliów zawiera dziesiątki pól, z których jeden to rsparid. – TravisVOX

+0

Dodałem trochę więcej informacji dla jasności. – TravisVOX

Odpowiedz

4

W NaN s oznacza, że ​​nie mają wartości w rsparid w powszechne. Może to być trudne, gdy łączenie rzeczy, które mogą wyglądać tak samo, kiedy repr

repr małych DataFrames ze strun (liczb całkowitych) lub całkowite wygląda tak samo i nie dtype informacja jest drukowana, gdy ramki są małe. Możesz uzyskać te informacje (i więcej) dla małych ramek, wywołując metodę DataFrame.info(), na przykład: df.info(). To daje piękny podsumowanie tego, co znajduje się w DataFrame i co dtype s swoich kolumn to:

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) 

UWAGA: Zauważysz niewielki różnicę w repr s tutaj, najprawdopodobniej z powodu dopełnienia numerycznego DataFrame s. Chodzi o to, że nikt nie byłby w stanie tego zobaczyć interaktywnie, chyba że szukałby różnicy.

+0

Właśnie dodałem do przykładu, jak zindeksowałem tabelę rspar, aby pokazać, że istnieje rsparid. Pochodzi prosto z pliku CSV za pośrednictwem 'read_csv', a tam właśnie znajdują się pliki rsparid. – TravisVOX

+0

Myślę, że nie rozumiesz 'scalania'. Jeśli nie ma * wartości * w 'datalines.rsparid', które są równe wartościom w' rspars.rsparid', otrzymasz 'NaN's, ponieważ nie ma się do czego przyłączyć. –

+0

Hej, jeśli sprawdzisz mój drugi przykład, w którym zmniejszyłem dane do tego, co tam jest, nadal mam problem. – TravisVOX