合并两个 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
我有两个数据框
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