Python Pandas объединяет только определенные столбцы

110

Можно ли объединить только несколько столбцов? У меня есть DataFrame df1 со столбцами x, y, z и df2 со столбцами x, a, b, c, d, e, f и т. Д.

Я хочу объединить два DataFrame на x, но я хочу объединить только столбцы df2.a, df2.b, а не весь DataFrame.

Результатом будет DataFrame с x, y, z, a, b.

Я мог бы объединить и удалить ненужные столбцы, но, похоже, есть способ получше.

ПузырьGuppies
источник
1
Энди: Святая корова, это было легко ... Мне нужен перерыв, я явно делаю это слишком сложным. Спасибо за ясность!
BubbleGuppies

Ответы:

81

Вы можете объединить суб-DataFrame (только с этими столбцами):

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

df1.merge(df2[list('xab')])
Энди Хайден
источник
6
Хммм, мне интересно, должен ли быть собственный способ сделать это, например, подмножество в dropna ... соберет проблему с github
Энди Хайден
Хммм ... Я пытался использовать это, чтобы объединить столбец "Unique_External_Users" из df2 в df1, но получил ошибку ... "Ни один из [Index (['U', 'n', 'i', 'q', 'u ',' e ',' ',' E ',' x ',' t ',' e ',' r ',' n ',' a ', \ n' l ',' ',' U ', 's', 'e', ​​'r', 's'], \ n dtype = 'object')] находятся в [столбцах] ".
CoolDocMan
Вот код. ... df1.merge (df2 ('Unique_External_Users')])
CoolDocMan
1
@CoolDocMan Я думаю, вы что-то упустили из предложенного ответа: list('xab')берет каждый элемент (букву) строки 'xab' и преобразует его в элемент списка, поэтому list('xab')возвращается ['x', 'a', 'b']. Это работает, если у каждого столбца в качестве имени есть одна буква. В вашем случае я думаю, вам нужно сделать df1.merge (df2 ['Unique_External_Users'], * other_arguments). ... Скорее всего, вы уже решили это, просто оставив это для новичков, таких как я
SOf_PUAR
114

Вы хотите использовать ДВЕ скобки, поэтому, если вы выполняете действие типа ВПР:

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

Это даст вам все в исходном df + добавьте тот соответствующий столбец в df2, к которому вы хотите присоединиться.

Артур Д. Хауленд
источник
12

Если вы хотите удалить столбцы из целевого фрейма данных, но столбцы необходимы для объединения, вы можете сделать следующее:

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

Эта .drop('key1')часть предотвратит сохранение key1 в итоговом фрейме данных, несмотря на то, что в первую очередь требуется соединение.

тоннефэш
источник
5
Если я попробую это сделать, у меня появится следующая ошибка:KeyError: "['key1'] not found in axis"
Таня Бранаган
3
попробуйте .drop (columns = ['key1'])
псангам
Или .drop ('key1', axis = 1)
tonneofash
8

Вы можете использовать .locдля выбора определенных столбцов со всеми строками, а затем вытащить их. Пример ниже:

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

В этом примере вы объединяете dataframe1 и dataframe2. Вы выбрали внешнее левое соединение по ключу. Однако для dataframe2 вы указали, .ilocчто позволяет указать нужные строки и столбцы в числовом формате. Используя :, вы выбираете все строки, но [0:5]выбираете первые 5 столбцов. Вы можете использовать .locдля указания по имени, но если вы имеете дело с длинными именами столбцов, это .ilocможет быть лучше.

Терренс ДеДжесус
источник
1
Остерегайтесь того, что .locбудет сделана копия , а на большом df это может быть болезненно. Возможно, лучше выполнить слияние, а затем сразу взять срез столбца в том же выражении.
smci
7

Это объединение выбранных столбцов из двух таблиц.

Если table_1содержит t1_a,t1_b,t1_c..,id,..t1_zстолбцы и table_2содержит t2_a, t2_b, t2_c..., id,..t2_zстолбцы, а в итоговой таблице требуются только t1_a, id, t2_a, тогда

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
источник