我有两个来自两个不同来源的 pandas 数据框,它们都包含建筑物地址,我想合并它们。我遇到的问题是,两组地址的记录方式并不完全相同。具体来说是街道的方向(“N”、“E”、“S”、“W”)。
一组中的某些地址有方向,而其他地址没有,因此,如果我使用方向作为合并列,一些匹配的地址不会合并在一起(例如一组中的“123 Main St”和一组中的“123 N Main St”)另一个)。有些建筑物除了方向外具有相同的地址(例如“456 N Other Ave”和“456 S Other Ave”),因此我不想完全忽略方向,但我想使用街道的方向作为仅当存在重复地址时才使用的辅助合并列,否则将被忽略。有办法做到这一点吗?
我用于此合并的两列是 full_add
和 dir
,其中包含 '123 Main St'
和 ' 等条目分别为 N'
。
这是一个例子:
df1 = pd.DataFrame({
'full_add': ['123 Main St', '456 Other Ave', '456 Other Ave'],
'dir': ['N', 'N', 'S'],
'left_val': [100, 200, 300]
})
df2 = pd.DataFrame({
'full_add': ['123 Main St', '456 Other Ave', '456 Other Ave'],
'dir': [np.nan, 'N', 'S'],
'right_val': [1000, 2000, 3000]
})
merged = pd.DataFrame({
'full_add': ['123 Main St', '456 Other Ave', '456 Other Ave'],
'dir': ['N', 'N', 'S'],
'left_val': [100, 200, 300],
'right_val': [1000, 2000, 3000]
})
最佳答案
实现此目的的一种方法是仅加入“full_add”,然后过滤掉那些您不想要的记录,例如不为空的不匹配目录。
df_out = df1.merge(df2, on='full_add')
mask = ((df_out.dir_x.isnull()) | (df_out.dir_y.isnull()) | (df_out.dir_x == df_out.dir_y))
df_out[mask]
输出:
dir_x full_add left_val dir_y right_val
0 N 123 Main St 100 NaN 1000
1 N 456 Other Ave 200 N 2000
4 S 456 Other Ave 300 S 3000
关于python - Pandas 在列上与可选的辅助列合并,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47582893/