我有两个数据帧,
df1 = pd.DataFrame({'A': ['A1', 'A1', 'A2', 'A3'],
'B': ['121', '345', '123', '146'],
'C': ['K0', 'K1', 'K0', 'K1']})
df2 = pd.DataFrame({'A': ['A1', 'A3'],
'BB': ['B0', 'B3'],
'CC': ['121', '345'],
'DD': ['D0', 'D1']})
现在我需要从df1中获取A列和B列的类似行,从df2获取A列和CC列。 所以我尝试了可能的合并选项,例如:
both_DFS=pd.merge(df1,df2, how='left',left_on=['A','B'],right_on=['A','CC'])
这不会给我df2数据帧的行信息,这是我需要的。意思是,我有来自df2的所有列名,但行只是空或Nan。
然后我尝试了:
Both_DFs=pd.merge(df1,df2, how='left',left_on=['A','B'],right_on=['A','CC'])[['A','B','CC']]
这给了我错误,
KeyError: "['B'] not in index"
我的目标是使用df1和df2中的所有列合并Dataframe。任何建议都会很棒
期望的输出:
Both_DFs
A B C BB CC DD
0 A1 121 K0 B0 121 D0
因此,在我的数据框架(df1和df2)中,只有一行与两个感兴趣的列完全匹配。也就是说,df1中的A列和B列只有一行与df2中A列和CC列的行完全匹配
答案 0 :(得分:3)
好吧,如果你将列A
声明为索引,它就可以工作:
Both_DFs = pd.merge(df1.set_index('A', drop=True),df2.set_index('A', drop=True), how='left',left_on=['B'],right_on=['CC'], left_index=True, right_index=True).dropna().reset_index()
这导致:
A B C BB CC DD
0 A1 123 K0 B0 121 D0
1 A1 345 K1 B0 121 D0
2 A3 146 K1 B3 345 D1
修改强>
你只需要:
Both_DFs = pd.merge(df1,df2, how='left',left_on=['A','B'],right_on=['A','CC']).dropna()
给出了:
A B C BB CC DD
0 A1 121 K0 B0 121 D0
答案 1 :(得分:1)
您也可以将join
与默认左连接或merge
一起使用,如有必要,请在dropna
之后移除NaN
的行:
print (df1.join(df2.set_index('A'), on='A').dropna())
A B C BB CC DD
0 A1 123 K0 B0 121 D0
1 A1 345 K1 B0 121 D0
3 A3 146 K1 B3 345 D1
print (pd.merge(df1, df2, on='A', how='left').dropna())
A B C BB CC DD
0 A1 123 K0 B0 121 D0
1 A1 345 K1 B0 121 D0
3 A3 146 K1 B3 345 D1
编辑:
我认为您需要inner join
(默认情况下,on='inner'
可以省略):
Both_DFs = pd.merge(df1,df2, left_on=['A','B'],right_on=['A','CC'])
print (Both_DFs)
A B C BB CC DD
0 A1 121 K0 B0 121 D0
答案 2 :(得分:0)
我不知道您的示例是否显示您的问题,但
如果我们尝试与MultiIndex合并,我们需要匹配2个索引。
df1 [' A'] == df2 [' A']&& df1 [' B'] == df2 [' CC']
这里我们没有符合2索引的任何行。
如果我们仅仅通过df1 [' A']合并,我们就会得到这样的结果: Both_DFs = pd.merge(df1,df2,how =' left',left_on = [' A'],right_on = [' A'])
A B C BB CC DD
0 A1 123 K0 B0 121 D0
1 A1 345 K1 B0 121 D0
2 A2 121 K0 NaN NaN NaN
3 A3 146 K1 B3 345 D1
如果您要删除不在df2中的行行,请尝试更改'如何'内心的方法。
Both_DFs=pd.merge(df1, df2, how='left', left_on=['A'], right_on=['A'])
A B C BB CC DD
0 A1 123 K0 B0 121 D0
1 A1 345 K1 B0 121 D0
2 A3 146 K1 B3 345 D1
这种方法是否适用于您所寻找的内容?