Łą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.
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
Nie jest to możliwe, ponieważ 'name' nie jest unikatowe w' df1' – user248237dfsf
Dlaczego nie ustawisz index_indeksu po scaleniu? – user1827356