合并两个 pandas 数据框而不复制项目

merge two pandas dataframes without duplicating items

我有两个数据框

left = pd.DataFrame(
    {"K": ["K0", "K0", "K1", "K2"], "A": ["A0", "A1", "A2", "A3"], "B": ["B0", "B1", "B2", "B3"]}
)

right = pd.DataFrame(
    {"K": ["K0", "K0", "K0", "K2"], "C": ["C0", "C1", "C2", "C3"], "D": ["D0", "D1", "D2", "D3"]}
)

    K   A   B
0  K0  A0  B0
1  K0  A1  B1
2  K1  A2  B2
3  K2  A3  B3

    K   C   D
0  K0  C0  D0
1  K0  C1  D1
2  K0  C2  D2
3  K2  C3  D3

我想将它们组合成一个数据帧,这样只有在两个数据帧中都存在键的行才会被考虑:

   K   A   B   C   D
0  K0  A0  B0  C0  D0
1  K0  A1  B1  C1  D1
2  K2  A2  B2  C3  D3

如果我使用 pandas.merge,我总是会得到重复的行。有没有简单的方法可以做到这一点?

枚举键,然后合并键和枚举:

(left.assign(enum=left.groupby('K').cumcount())
     .merge(right.assign(enum=right.groupby('K').cumcount()),
            on=['K', 'enum'])
     .drop('enum', axis=1)
)

输出:

    K   A   B   C   D
0  K0  A0  B0  C0  D0
1  K0  A1  B1  C1  D1
2  K2  A3  B3  C3  D3

使用pd.concat

data1="""Index  K   A   B
0  K0  A0  B0
1  K0  A1  B1
2  K1  A2  B2
3  K2  A3  B3"""

data2="""K   C   D
0  K0  C0  D0
1  K0  C1  D1
2  K0  C2  D2
3  K2  C3  D3"""

data1 = pd.read_table(StringIO(data1), sep='\s+')
data1 = data1.rename(columns={'K':'K1'})

data2 = pd.read_table(StringIO(data2), sep='\s+')
data2 = data2.rename(columns={'K':'K2'})
data  = pd.concat([data1, data2], axis=1)


#print(data1,data2)
data = data.drop(data[data.K1 != data.K2].index, axis=0)
data.drop('K2',axis=1,inplace=True)
print(data)

输出

   Index  K1   A   B   C   D
0      0  K0  A0  B0  C0  D0
1      1  K0  A1  B1  C1  D1
3      3  K2  A3  B3  C3  D3