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