Mam 3 pliki CSV. Każda z nich ma pierwszą kolumnę jako (ciąg) nazwisk osób, podczas gdy wszystkie pozostałe kolumny w każdej ramce danych są atrybutami tej osoby.
Jak mogę „połączyć” razem wszystkie trzy dokumenty CSV, aby utworzyć pojedynczy plik CSV, w którym każdy wiersz ma wszystkie atrybuty dla każdej unikalnej wartości nazwy ciągu danej osoby?
join()
Funkcja w Pandy Określa, że muszę multiindex, ale jestem mylić o co hierarchiczny system indeksujący ma do czynienia z podejmowania przystąpić na podstawie pojedynczego wskaźnika.
df1.join([df2, df3], on=[df2_col1, df3_col1])
nie działało.Odpowiedzi:
Zakładany import:
Odpowiedź Johna Galta jest w zasadzie
reduce
operacją. Jeśli mam więcej niż garść ramek danych, umieściłbym je na takiej liście (wygenerowanej za pomocą wyrażeń lub pętli listowych itp.):Zakładając, że mają one wspólną kolumnę, jak
name
w twoim przykładzie, zrobiłbym następujące:W ten sposób kod powinien działać z dowolną liczbą ramek danych, które chcesz scalić.
Edytuj 1 sierpnia 2016 r . : Dla osób używających Python 3:
reduce
został przeniesiony dofunctools
. Aby użyć tej funkcji, musisz najpierw zaimportować ten moduł:źródło
reduce
został zastąpiony przezfunctools.reduce
Soimport functools functools.reduce(.......)
name1
,name2
iname3
odpowiednio.n-1
wywołania funkcji scalania? Wydaje mi się, że w tym przypadku, gdy liczba ramek danych jest niewielka, nie ma to znaczenia, ale zastanawiam się, czy istnieje bardziej skalowalne rozwiązanie.df
indeksów kolumnowych (wstawiał „on” jako kolumnę, która działała dla pierwszego scalenia, ale kolejne scalenia nie powiodły się), zamiast tego udało mi się pracować z:df = reduce(lambda left, right: left.join(right, how='outer', on='Date'), dfs)
Możesz spróbować, jeśli masz 3 ramki danych
alternatywnie, jak wspomniano przez cwharland
źródło
df1.merge(df2,on='name').merge(df3,on='name')
name1
,name2
iname3
odpowiedniodf1.merge(df2,left_on='name1', right_on='name2').merge(df3,left_on='name1', right_on='name3').drop(columns=['name2', 'name3']).rename(columns={'name1':'name'})
Jest to idealna sytuacja dla tej
join
metodyjoin
Metoda jest zbudowana właśnie dla takich sytuacjach. Możesz dołączyć do niego dowolną liczbę ramek danych. Wywoływająca DataFrame łączy się z indeksem kolekcji przekazanych DataFrames. Aby pracować z wieloma ramkami danych, należy umieścić kolumny łączące w indeksie.Kod wyglądałby mniej więcej tak:
Z danymi @ zero możesz to zrobić:
źródło
pd.DataFrame().join(dfs, how="outer")
. W niektórych sytuacjach może to być czystsze.pd.concat
spowoduje prostszej składni:pd.concat([df.set_index('name') for df in dfs], axis=1, join='inner').reset_index()
.concat
jest również bardziej wszechstronny, gdy ma do czynienia ze zduplikowanymi nazwami kolumn w wielu plikach dfs (join
nie jest w tym tak dobry), chociaż można za jego pomocą wykonywać tylko połączenia wewnętrzne lub zewnętrzne.dfs[0].join(dfs[1:])
należy edytować,dfs[0].join(dfs[1:], sort=False)
ponieważ w przeciwnym razieFutureWarning
pojawi się testament. Dzięki za miły przykład.ValueError: Indexes have overlapping values
Występuje błąd przy próbie, że: chociaż po sprawdzeniu poszczególnych ramek danych na liście nie wydają się one nakładać na siebie wartości.Można to również zrobić w następujący sposób dla listy ramek danych
df_list
:lub jeśli ramki danych znajdują się w obiekcie generatora (np. w celu zmniejszenia zużycia pamięci):
źródło
W wersji
python
3.6.3 zpandas
0.22.0 możesz także używaćconcat
tak długo, jak ustawisz jako indeks kolumny, których chcesz użyć do łączeniagdzie
df1
,df2
idf3
są zdefiniowane jak w odpowiedzi Johna Galtaźródło
Do wykonywania operacji łączenia nie jest potrzebny multiindeks . Trzeba tylko poprawnie ustawić kolumnę indeksu, na której mają być wykonywane operacje łączenia (które polecenie
df.set_index('Name')
na przykład)join
Operacja jest domyślnie wykonywane na indeksie. W twoim przypadku wystarczy określić, żeName
kolumna odpowiada Twojemu indeksowi. Poniżej znajduje się przykładPoradnik mogą być użyteczne.
źródło
Oto metoda scalenia słownika ramek danych przy jednoczesnym zachowaniu synchronizacji nazw kolumn ze słownikiem. W razie potrzeby uzupełnia brakujące wartości:
Jest to funkcja scalania dict ramek danych
OK, pozwala generować dane i przetestować to:
źródło
Proste rozwiązanie:
Jeśli nazwy kolumn są podobne:
Jeśli nazwy kolumn są różne:
źródło
Istnieje inne rozwiązanie z dokumentacji pand (której tu nie widzę),
używając
.append
ignore_index=True
Służy do ignorowania indeks załączonym dataframe, zastępując ją do następnego indeksu dostępnych w jedno źródło.Jeśli istnieją różne nazwy kolumn,
Nan
zostaną wprowadzone.źródło
Trzy ramki danych to
Połączmy te ramki za pomocą zagnieżdżonego pd.merge
Proszę bardzo, mamy scaloną ramkę danych.
Szczęśliwa analiza !!!
źródło