Chciałbym połączyć dwa DataFrames
i zachować indeks z pierwszej klatki jako indeks scalonego zbioru danych. Jednak gdy wykonuję scalanie, wynikowa ramka DataFrame ma indeks całkowity. Jak mogę określić, że chcę zachować indeks z lewej ramki danych?
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')
EDYCJA: Przełączono na przykładowy kod, który można łatwo odtworzyć
Odpowiedzi:
Uwaga: w przypadku niektórych operacji scalania po lewej stronie możesz otrzymać więcej wierszy, jeśli istnieje wiele dopasowań między
a
i,b
a będziesz musiał dokonać deduplikacji ( dokumentacja dotycząca deduplikacji ). Dlatego pandy nie przechowują dla ciebie indeksu.źródło
a
ramka. reset_index przenosi indeks do zwykłej kolumny, a set_index z tej kolumny po scaleniu dba również o to, gdy wiersze a są duplikowane / usuwane z powodu operacji scalania.a.reset_index().merge(b, how="left").set_index(a.index.names)
.Możesz zrobić kopię indeksu w lewej ramce danych i scalić.
Uważam, że ta prosta metoda jest bardzo przydatna podczas pracy z dużą ramką danych i używania
pd.merge_asof()
(lubdd.merge_asof()
).Takie podejście byłoby lepsze, gdy resetowanie indeksu jest drogie (duża ramka danych).
źródło
Istnieje rozwiązanie inne niż pd.merge. Korzystanie
map
iset_index
I nie wprowadza fikcyjnej
index
nazwy indeksu.źródło
pd.Dataframe
a niepd.Series
..map()
Sposób jest określone tylko dlapd.Series
. To znaczy, że:a[['to_merge_on_1', 'to_merge_on_2']].map(...)
nie zadziała.Pozwala to zachować indeks df1
źródło
on=list_of_cols]
, stoi w sprzeczności z dokumentacją:If joining columns on columns, the DataFrame indexes *will be ignored*
. Czy pierwszeństwo ma używanie indeksów i kolumn?Myślę, że wymyśliłem inne rozwiązanie. Dołączyłem do lewej tabeli na wartości indeksu i prawej tabeli na wartości kolumny opartej na indeksie lewej tabeli. To, co zrobiłem, było normalnym połączeniem:
Następnie odzyskałem nowe numery indeksu ze scalonej tabeli i umieściłem je w nowej kolumnie o nazwie Sentiment Line Number:
Następnie ręcznie ustawiłem indeks z powrotem na oryginalny, lewy indeks tabeli w oparciu o wcześniej istniejącą kolumnę o nazwie Numer wiersza (wartość kolumny, do której dołączyłem z lewego indeksu tabeli):
Następnie usunięto nazwę indeksu Line Number, aby pozostała pusta:
Może trochę hack, ale wydaje się działać dobrze i stosunkowo prosto. Zgadnij, że zmniejsza to ryzyko duplikowania / zepsucia danych. Mam nadzieję, że to wszystko ma sens.
źródło
Inną prostą opcją jest zmiana nazwy indeksu na wcześniejszą:
merge zachowuje kolejność w dataframe 'a', ale po prostu resetuje indeks, więc można go zapisać do użycia set_axis
źródło