2012-08-15 16 views
54

Chciałbym scalić dwa DataFrames i zachować indeks z pierwszej ramki jako indeks na scalonym zestawie danych. Jednak po scaleniu wynikowa ramka DataFrame ma indeks liczby całkowitej. Jak mogę określić, że chcę zachować indeks z lewej ramki danych?Jak zachować indeks podczas korzystania z pandy scalania

In [4]: a = pd.DataFrame({'col1': {'a': 1, 'b': 2, 'c': 3}, 
          'to_merge_on': {'a': 1, 'b': 3, 'c': 4}}) 

In [5]: b = pd.DataFrame({'col2': {0: 1, 1: 2, 2: 3}, 
          'to_merge_on': {0: 1, 1: 3, 2: 5}}) 

In [6]: a 
Out[6]: 
    col1 to_merge_on 
a  1   1 
b  2   3 
c  3   4 

In [7]: b 
Out[7]: 
    col2 to_merge_on 
0  1   1 
1  2   3 
2  3   5 

In [8]: a.merge(b, how='left') 
Out[8]: 
    col1 to_merge_on col2 
0  1   1 1.0 
1  2   3 2.0 
2  3   4 NaN 

In [9]: _.index 
Out[9]: Int64Index([0, 1, 2], dtype='int64') 

EDIT: Switched na przykład kodu, który może być łatwo reprodukowane

+29

To musi być w pierwszej 10 najgłupszych rzeczy o pandach ... ... dlaczego utrata indeksu miała kiedykolwiek sens? – Corone

Odpowiedz

69
In [5]: a.reset_index().merge(b, how="left").set_index('index') 
Out[5]: 
     col1 to_merge_on col2 
index 
a   1   1  1 
b   2   3  2 
c   3   4 NaN 
+1

Bardzo sprytny. a.merge (b, how = "left"). set_index (a.index) również działa, ale wydaje się mniej niezawodny (ponieważ pierwsza jego część traci wartości indeksu do a, zanim je zresetuje.) – DanB

+7

Dla tego konkretnego przypadku, są one równoważne. Jednak w przypadku wielu operacji scalania wynikowa klatka nie ma takiej samej liczby wierszy, co oryginalna ramka 'a'. reset_index przenosi indeks do zwykłej kolumny, a set_index z tej kolumny po scaleniu również dba o to, gdy wiersze a są duplikowane/usuwane z powodu operacji scalania. –

+0

Nie wiedziałem, dlaczego moje rozwiązanie się zepsuło, ale pomyślałem, że tak. Rozwiązanie reset_index(), a następnie set_index() ma wiele sensu. Dzięki. – DanB

1

Istnieje rozwiązanie nie pd.merge. Korzystanie map i set_index

In [1744]: a.assign(col2=a['to_merge_on'].map(b.set_index('to_merge_on')['col2'])) 
Out[1744]: 
    col1 to_merge_on col2 
a  1   1 1.0 
b  2   3 2.0 
c  3   4 NaN 

I nie wprowadza obojętne index nazwę indeksu.

Powiązane problemy