2013-10-01 55 views
30

我正在尝试两个数据帧之间的合并。每个数据框有两个索引级别(日期,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 

谢谢! ...

+0

实际的解决方案可能是删除虚假的列。不过,我很乐意看到更好的答案。 – Marcin

+0

为什么不选择你想合并的列就像这样:'dfNew = merge(df,df2 [['data_col_2']],left_index = True,right_index = True,how ='outer')'这样可以避免重复列和冲突 – EdChum

+0

我同意较小的数据框,但每个数据框都是90列,并且可能有10个重叠列。 – user1911092

回答

49

您可以制定出了仅在一个数据帧和使用在合并

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

+5

这是伟大的,我只是想用0.15更新,这将给出一个弃用警告,建议新的语法cols_to_use = df2.columns.difference df.columns) – odedbd

+0

@odedbd感谢您的评论,已更新我的答案 – EdChum

+0

如果您使用left_on和right_on,那么此解决方案不起作用。 – HVS

27

我使用suffixes选项.merge()

dfNew = df.merge(df2, left_index=True, right_index=True, 
       how='outer', suffixes=('', '_y')) 

然后,您可以筛选基于列在国旗“_y”上,即删除它们。

1

我刚刚与大熊猫新,但我想实现同样的事情,自动避免列名_x或_y和删除重复的数据。我终于用这种answerone从#1

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 进口大熊猫

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=';') 

做到了

当执行合并命令我带一个空字符串替换_x后缀,并将它们我可以删除与_y

输出结束列。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