2013-03-27 12 views
6

Łączę dwie ramki danych przy użyciu merge(..., how='left'), ponieważ chcę zachować tylko te wpisy, które pasują do "lewej" ramki danych. Problem polega na tym, że operacja scalania wydaje się spadek indeksu mojej skrajnej lewej dataframe, pokazany tutaj:pandy spada indeks indeksu na scalanie w Pythonie?

import pandas 
df1 = pandas.DataFrame([{"id": 1, 
         "name": "bob"}, 
         {"id": 10, 
         "name": "sally"}]) 
df1 = df1.set_index("id") 
df2 = pandas.DataFrame([{"name": "bob", 
         "age": 10}, 
         {"name": "sally", 
         "age": 11}]) 

print "df1 premerge: " 
print df1 
df1 = df1.merge(df2, on=["name"], 
       how="left") 
print "merged: " 
print df1 
# This is not "id" 
print df1.index 
# And there's no "id" field 
assert ("id" in df1.columns) == False 

Przed scaleniem, df1 był indeksowany przez id. Po operacji scalania istnieje tylko domyślny indeks numeryczny scalonej ramki danych, a pole id zostało usunięte. Jak mogę wykonać tego rodzaju operację scalania, ale zachowam indeks skrajnej lewej ramki danych?

Aby wyjaśnić: Chcę, aby wszystkie kolumny z df2 zostały dodane do każdego wpisu w pozycji df1 o wartości zgodnej id. Jeśli pozycja w pozycji df2 ma wartość id, a nie df1, nie należy jej scalać (stąd nazwa how='left').

edit: Mógłbym jako hack zrobić: df1.reset_index() ale scalanie, a następnie ustawić indeks ponownie, ale wolę nie, jeśli to możliwe, wydaje się scaleniu nie powinien mieć do spadku indeksu. dzięki.

+0

Można spróbować indeksować 'df1' i' df2' przez nazwę zamiast id, a następnie użyć 'join' zamiast' merge' w ten sposób: 'df1.join (df2)', który zachowa indeks. – bdiamante

+0

Nie jest to możliwe, ponieważ 'name' nie jest unikatowe w' df1' – user248237dfsf

+0

Dlaczego nie ustawisz index_indeksu po scaleniu? – user1827356

Odpowiedz

3

Wskazałeś już, że robisz reset_index przed scaleniem, a następnie set_index, który działa. Jedynym sposobem, w jaki znam zachowanie indeksów przez scalanie, jest scalenie indeksu na co najmniej jednej z łączonych ramek danych. Więc tutaj, można zrobić:

In [403]: df2 = df2.set_index('name') 

In [404]: df1.merge(df2, left_on='name', right_index=True) 
Out[404]: 
    name age 
id    
1  bob 10 
10 sally 11 

scalić indeks DF2, który podjęliśmy z jego nazwanej kolumnie przeciwko nazwanej kolumnie DF1.

Ma to pewien sens, ponieważ w przeciwnym razie indeks wynikowej ramki danych jest niejednoznaczny, ponieważ może pochodzić z dowolnej ramki danych.

Powiązane problemy