Jak połączyć dwie ramki danych?

107

Używam ramek danych Pandas. Powiedzmy, że mam początkową ramkę danych D. Wyodrębniam z niego dwie ramki danych w następujący sposób:

A = D[D.label == k]
B = D[D.label != k]

potem zmieniam etykietę na AiB

A.label = 1
B.label = -1

Chcę połączyć A i B, aby mieć je jako jedną ramkę danych, coś w rodzaju operacji unii. Kolejność danych nie jest ważna. Jednak kiedy próbujemy A i B z D, zachowują swoje indeksy z D.

MKoosej
źródło

Odpowiedzi:

153

Uważam, że możesz użyć tej appendmetody

bigdata = data1.append(data2, ignore_index=True)

aby zachować swoje indeksy, po prostu nie używaj ignore_indexsłowa kluczowego ...

Joran Beasley
źródło
1
To działa. Tworzy jednak nową ramkę DataFrame. Czy jest sposób, aby to zrobić w tekście? Byłoby miło, gdybym ładował ogromne ilości danych z bazy danych w partiach, więc mógłbym iteracyjnie aktualizować DataFrame bez tworzenia kopii za każdym razem.
Andrew
1
Tak, to możliwe, zobacz: stackoverflow.com/a/46661368/5717580
martin-martin
91

Możesz również użyć pd.concat, co jest szczególnie przydatne, gdy łączysz więcej niż dwie ramki danych:

bigdata = pd.concat([data1, data2], ignore_index=True, sort=False)
ostrokach
źródło
Chcę tego użyć, ale próbuję połączyć dwie kolumny o tej samej nazwie o_O
lifelonglearner
45

Pomyślałem o dodaniu tego tutaj na wypadek, gdyby ktoś uznał to za przydatne. @ostrokach już wspomniał, jak można scalać ramki danych w wierszach, czyli

df_row_merged = pd.concat([df_a, df_b], ignore_index=True)

Aby scalić kolumny, możesz użyć następującej składni:

df_col_merged = pd.concat([df_a, df_b], axis=1)
pelumi
źródło
14

Istnieje inne rozwiązanie w przypadku, gdy pracujesz z dużymi zbiorami danych i musisz połączyć wiele zestawów danych. concatmoże wymagać dużej wydajności, więc jeśli nie chcesz za każdym razem tworzyć nowego pliku df, możesz zamiast tego użyć funkcji list złożonych :

frames = [ process_file(f) for f in dataset_files ]
result = pd.append(frames)

(jak wskazano tutaj w dokumentach na dole tej sekcji):

Uwaga : Warto jednak zauważyć, że concat(i dlatego append) tworzy pełną kopię danych i że ciągłe ponowne użycie tej funkcji może spowodować znaczny spadek wydajności. Jeśli musisz wykonać operację na kilku zbiorach danych, użyj rozumienia list.

martin-martin
źródło
2

Jeśli chcesz zaktualizować / zastąpić wartości pierwszej ramki df1danych wartościami drugiej ramki danych df2. możesz to zrobić, wykonując następujące czynności -

Krok 1: Ustaw indeks pierwszej ramki danych (df1)

df1.set_index('id')

Krok 2: Ustaw indeks drugiej ramki danych (df2)

df2.set_index('id')

i na koniec zaktualizuj ramkę danych za pomocą następującego fragmentu kodu -

df1.update(df2)
Mohsin Mahmood
źródło
0

1. dataFrame

train.shape

wynik:-

(31962, 3)

2nd dataFrame

test.shape

wynik:-

(17197, 2)

Połączyć

new_data=train.append(test,ignore_index=True)

Czek

new_data.shape

wynik:-

(49159, 3)
Harish Kumawat
źródło