如何合并列A
和B
上的两个数据框:
df1
A B C
1 2 3
2 8 2
4 7 9
df2
A B C
5 6 7
2 8 9
结果只得到那两个匹配行的结果。
df3
A B C
2 8 2
2 8 9
答案 0 :(得分:4)
您可以连接它们并删除那些不重复的内容:
D
如果您有重复项,
conc = pd.concat([df1, df2])
conc[conc.duplicated(subset=['A', 'B'], keep=False)]
Out:
A B C
1 2 8 2
1 2 8 9
您可以通过布尔数组跟踪重复的数据:
df1
Out:
A B C
0 1 2 3
1 2 8 2
2 4 7 9
3 4 7 9
4 2 8 5
df2
Out:
A B C
0 5 6 7
1 2 8 9
3 5 6 4
4 2 8 10
答案 1 :(得分:1)
使用Index.intersection
解决方案,然后在DataFrames
loc
和concat
之间选择值:
df1.set_index(['A','B'], inplace=True)
df2.set_index(['A','B'], inplace=True)
idx = df1.index.intersection(df2.index)
print (idx)
MultiIndex(levels=[[2], [8]],
labels=[[0], [0]],
names=['A', 'B'],
sortorder=0)
df = pd.concat([df1.loc[idx],df2.loc[idx]]).reset_index()
print (df)
A B C
0 2 8 2
1 2 8 9
答案 2 :(得分:1)
这是一个效率较低的方法,应该保留重复项,但涉及两个合并/连接
private void Button1_Click(object sender, EventArgs e)
{
Button btn = sender as Button;
string[] indexes = btn.Tag.ToString().Split(',');
//in indexes[0] you've got the i index and in indexes[1] the j index
Console.WriteLine(indexes[0] + "," + indexes[1]);
}
返回
# create a merged DataFrame with variables C_x and C_y with the C values
temp = pd.merge(df1, df2, how='inner', on=['A', 'B'])
# join columns A and B to a stacked DataFrame with the Cs on index
temp[['A', 'B']].join(
pd.DataFrame({'C':temp[['C_x', 'C_y']].stack()
.reset_index(level=1, drop=True)})).reset_index(drop=True)