按列值连接数据帧

时间:2016-12-22 10:03:57

标签: python pandas dataframe

如何合并列AB上的两个数据框:

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

3 个答案:

答案 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 locconcat之间选择值:

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)