2013-07-31 16 views
30

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, itp.Pandy Pythona łączą tylko niektóre kolumny

Chcę scalić dwa DataFrames na x, ale ja tylko chcesz połączyć kolumny df2.a, df2.b - nie całą ramkę DataFrame.

Wynikiem będzie DataFrame zx, y, z, a, b.

Mogę scalić, a następnie usunąć niechciane kolumny, ale wygląda na to, że istnieje lepsza metoda.

+1

Andy: Święta krowa, która była łatwa ... Potrzebuję przerwy, oczywiście robię to zbyt skomplikowanym. Dzięki za jasność! – joelotz

Odpowiedz

32

Można scalić sub-DataFrame (z tylko tych kolumn):

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

df1.merge(df2[list('xab')]) 
+3

Hmmm, zastanawiam się, czy powinien być natywny sposób, aby to zrobić, jak podzbiór w dropna ... połączy Github numer –

4

Można użyć .loc aby wybrać konkretne kolumn z wszystkich wierszy, a następnie wyciągnąć to. Przykład znajduje się poniżej:

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

W tym przykładzie łączysz ramkę danych1 i ramkę danych2. Wybrałeś zewnętrzne połączenie z lewej na "klucz". Jednak w przypadku ramek danych2 podałeś .iloc, który pozwala ci określić konkretne wiersze i kolumny w formacie liczbowym. Przy użyciu :, wybierając wszystkie wiersze, ale [0:5] wybiera pierwszych 5 kolumn. Możesz użyć opcji .loc, aby określić nazwę, ale jeśli masz do czynienia z długimi nazwami kolumn, wtedy .iloc może być lepsza.

4

Chcesz wykorzystać dwa wsporniki, więc jeśli robisz WYSZUKAJ.PIONOWO rodzaju działania:

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

ten daje wszystko w oryginalnym df + dodaj tamten odpowiedniej kolumnie w df2 że chcesz Przystąpić.

2

Umożliwia to połączenie wybranych kolumn z dwóch tabel.

Jeśli table_1 zawiera t1_a,t1_b,t1_c..,id,..t1_z kolumny i table_2 zawiera t2_a,t2_b,t2_c...,id,..t2_z kolumny i tylko t1_a, ID, t2_a są wymagane w końcowej tabeli, a następnie

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)

+0

dziękuję - to wszystko, czego chciałem. –