Pandas Объединить - Как избежать дублирования столбцов
Я пытаюсь объединить между двумя кадрами данных. Каждый кадр данных имеет два уровня индекса (дата, cusip). В столбцах некоторые столбцы сопоставляются между двумя (валюта, дата прихода), например.
Каков наилучший способ объединить их по индексу, но не принимать две копии валюты и даты вступления в силу.
Каждый кадр данных составляет 90 столбцов, поэтому я стараюсь не записывать все вручную.
df: currency adj_date data_col1 ...
date cusip
2012-01-01 XSDP USD 2012-01-03 0.45
...
df2: currency adj_date data_col2 ...
date cusip
2012-01-01 XSDP USD 2012-01-03 0.45
...
Если я это сделаю:
dfNew = merge(df, df2, left_index=True, right_index=True, how='outer')
Я получаю
dfNew: currency_x adj_date_x data_col2 ... currency_y adj_date_y
date cusip
2012-01-01 XSDP USD 2012-01-03 0.45 USD 2012-01-03
Спасибо! ...
Ответы
Ответ 1
Вы можете обрабатывать столбцы, которые находятся только в одном фрейме данных, и использовать его для выбора поднабора столбцов в слиянии
cols_to_use = df2.columns - df.columns
затем выполните слияние с помощью этого (обратите внимание, что это объект-указатель, но он имеет удобный метод tolist()
)
dfNew = merge(df, df2[cols_to_use], left_index=True, right_index=True, how='outer')
Это позволит избежать столкновений столбцов в слиянии
Для версии 0.15 и выше новый предпочтительный синтаксис:
cols_to_use = df2.columns.difference(df.columns)
спасибо @odedbd
Ответ 2
Я использую параметр suffixes
в .merge()
:
dfNew = df.merge(df2, left_index=True, right_index=True,
how='outer', suffixes=('', '_y'))
Затем вы можете фильтровать столбцы на основе флага "_y", т.е. удалить их.
Ответ 3
Я недавно новичок в Pandas, но я хотел достичь того же, автоматически избегая имен столбцов с помощью _x или _y и удаляя повторяющиеся данные. Я, наконец, сделал это, используя этот ответ и этот один из Stackoverflow
sales.csv
city;state;units
Mendocino;CA;1
Denver;CO;4
Austin;TX;2
revenue.csv
branch_id;city;revenue;state_id
10;Austin;100;TX
20;Austin;83;TX
30;Austin;4;TX
47;Austin;200;TX
20;Denver;83;CO
30;Springfield;4;I
merge.py
import pandas
def drop_y(df):
# list comprehension of the cols that end with '_y'
to_drop = [x for x in df if x.endswith('_y')]
df.drop(to_drop, axis=1, inplace=True)
sales = pandas.read_csv('data/sales.csv', delimiter=';')
revenue = pandas.read_csv('data/revenue.csv', delimiter=';')
result = pandas.merge(sales, revenue, how='inner', left_on=['state'], right_on=['state_id'], suffixes=('', '_y'))
drop_y(result)
result.to_csv('results/output.csv', index=True, index_label='id', sep=';')
При выполнении команды merge я заменяю суффикс _x
пустой строкой, и я могу удалить столбцы, заканчивающиеся на _y
output.csv
id;city;state;units;branch_id;revenue;state_id
0;Denver;CO;4;20;83;CO
1;Austin;TX;2;10;100;TX
2;Austin;TX;2;20;83;TX
3;Austin;TX;2;30;4;TX
4;Austin;TX;2;47;200;TX