Python Pandy scalają tylko niektóre kolumny

110

Czy można scalić tylko niektóre kolumny? Mam DataFrame df1 z kolumnami x, y, z i df2 z kolumnami x, a, b, c, d, e, f itd.

Chcę połączyć dwie ramki DataFrame na x, ale chcę tylko scalić kolumny df2.a, df2.b - a nie całą ramkę DataFrame.

Wynik byłby DataFrame z x, y, z, a, b.

Mógłbym scalić, a następnie usunąć niechciane kolumny, ale wydaje się, że istnieje lepsza metoda.

BubbleGuppies
źródło
1
Andy: Jasna krowa, to było łatwe ... Potrzebuję przerwy, oczywiście to zbyt skomplikowane. Dzięki za jasność!
BubbleGuppies,

Odpowiedzi:

81

Możesz scalić podrzędną ramkę danych (tylko z tymi kolumnami):

df2[list('xab')]  # df2 but only with columns x, a, and b

df1.merge(df2[list('xab')])
Andy Hayden
źródło
6
Hmmm, zastanawiam się, czy nie powinno być natywny sposób to zrobić, jak podzbioru w dropna ... będzie ułożyła GitHub problem
Andy Hayden
Hmmm ... Próbowałem użyć tego do scalenia kolumny „Unique_External_Users” z df2 do df1, ale pojawił się błąd… „Żaden z [Index (['U', 'n', 'i', 'q', 'u ',' e ',' ',' E ',' x ',' t ',' e ',' r ',' n ',' a ', \ n' l ',' ',' U ', 's', 'e', ​​'r', 's'], \ n dtype = 'object')] znajdują się w [kolumnach] ".
CoolDocMan
Oto kod. ... df1.merge (df2 ('Unique_External_Users')])
CoolDocMan
1
@CoolDocMan Myślę, że przegapiłeś coś z proponowanej odpowiedzi: list('xab')pobiera każdy element (literę) ciągu „xab” i konwertuje go na element listy, więc list('xab')zwraca ['x', 'a', 'b']. To działa, jeśli każda kolumna ma jedną literę jako nazwę. W twoim przypadku myślę, że musisz zrobić df1.merge (df2 ['Unique_External_Users'], * other_arguments). ... Najprawdopodobniej już to rozwiązałeś, zostawiając to dla początkujących w pobliżu, takich jak ja
SOf_PUAR
114

Chcesz użyć DWÓCH nawiasów, więc jeśli wykonujesz akcję typu WYSZUKAJ.PIONOWO:

df = pd.merge(df,df2[['Key_Column','Target_Column']],on='Key_Column', how='left')

To da ci wszystko w oryginalnym df + dodaj tę jedną odpowiednią kolumnę w df2, którą chcesz dołączyć.

Arthur D. Howland
źródło
12

Jeśli chcesz usunąć kolumny z docelowej ramki danych, ale kolumny są wymagane do łączenia, możesz wykonać następujące czynności:

df1 = df1.merge(df2[['a', 'b', 'key1']], how = 'left',
                left_on = 'key2', right_on = 'key1').drop('key1')

.drop('key1')Część zapobiega „klucz1” z utrzymywane w otrzymanej ramki danych, mimo że jest wymagane, aby połączyć się w pierwszym miejscu.

tonneofash
źródło
5
Jeśli spróbuję, KeyError: "['key1'] not found in axis"
pojawia
3
try .drop (columns = ['key1'])
psangam
Lub .drop ('klucz1', oś = 1)
tonneofash
8

Możesz użyć .loc aby wybrać określone kolumny ze wszystkimi wierszami, a następnie wyciągnąć to. Przykład poniżej:

pandas.merge(dataframe1, dataframe2.iloc[:, [0:5]], how='left', on='key')

W tym przykładzie scalasz dataframe1 i dataframe2. Zdecydowałeś się wykonać zewnętrzne złączenie lewe na „kluczu”. Jednak dla dataframe2 określono, .ilocco pozwala określić żądane wiersze i kolumny w formacie liczbowym. Używając :, zaznaczasz wszystkie wiersze, ale [0:5]zaznaczasz pierwsze 5 kolumn. Możesz użyć, .locaby określić według nazwy, ale jeśli masz do czynienia z długimi nazwami kolumn, .ilocmoże być lepiej.

Terrance DeJesus
źródło
1
Uważaj, że .locutworzy kopię , a na dużym df może to być bolesne. Lepszym rozwiązaniem może być scalenie, a następnie natychmiastowe pobranie wycinka kolumny w tym samym wyrażeniu.
smci
7

Ma to na celu scalenie wybranych kolumn z dwóch tabel.

Jeśli table_1zawiera t1_a,t1_b,t1_c..,id,..t1_zkolumny i table_2zawiera t2_a, t2_b, t2_c..., id,..t2_zkolumny, aw ostatecznej tabeli wymagane są tylko t1_a, id, t2_a, to

mergedCSV = table_1[['t1_a','id']].merge(table_2[['t2_a','id']], on = 'id',how = 'left')
# save resulting output file    
mergedCSV.to_csv('output.csv',index = False)
Marco167
źródło