在pandas中合并并仅输出选定的列

时间:2018-03-16 19:47:28

标签: python pandas dataframe merge

有没有办法在pandas中进行合并,限制你想要看到的列?

我有什么:

DF1

ID Col1 Col2 Col3 Col4
1   1    1    1    D
2   A    C    C    4
3   B    B    B    d
4   X    2    3    6

DF2

ID ColA ColB ColC ColD
1   1    1    1    D
2   A    C    X    4
3   B    B    Y    d

我想要的是什么:

df_final

ID ColA ColB ColC ColD
1   NA   NA   NA   NA
2   A    C    X    4
3   B    B    Y    d
4   NA   NA   NA   NA

我想在两个数据帧上进行左连接(保留df1中的所有ID),但我只想保留df2中的列。如果来自df1的Col3是C或B,我也只想要值。

以下有效,但生成的df包含来自两个dfs的所有列。 我可以添加第三行只看到我想要的列,但这是一个简单的例子。实际上我有更大的数据集,很难手动输入我想要保留的所有列名。

df=pd.merge(df1,df2,how='left',on='ID')
df_final=df[df['Col3'].isin['C','B']]

等效SQL将是

create table df_final as 
select b.*
from df1 a
left join df2 b
on a.ID=b.ID
where a.Col3 in ('C','B')

2 个答案:

答案 0 :(得分:3)

df1

之前使用isin条件屏蔽merge
df1.where(df1.Col3.isin(['C', 'B']))[['ID']].merge(df2, how='left', on='ID')

或者,

df1.mask(~df1.Col3.isin(['C', 'B']))[['ID']].merge(df2, how='left', on='ID')

    ID ColA ColB ColC ColD
0  NaN  NaN  NaN  NaN  NaN
1    2    A    C    X    4
2    3    B    B    Y    d
3  NaN  NaN  NaN  NaN  NaN

答案 1 :(得分:0)

这应该可以解决问题

df=pd.merge(df1[df1.Col3.isin(['C','B'])][['ID']], df2, how='left', on='ID')