Pandas在列上合并可选的辅助列

时间:2017-11-30 21:28:26

标签: python pandas dataframe merge

我有两个来自两个不同来源的pandas数据帧都包含构建地址,我想合并它们。我遇到的问题是地址在两组中的记录方式不完全相同。特别是街道的方向(' N' E',' S' W' W')。

一组中的某些地址有方向而有些区域没有方向,所以如果我将方向用作合并列,则一些匹配的地址不会合并在一起(例如' 123 Main St' in one and&# 39; 123 N Main St'在另一个)。有些建筑物除了方向外都有相同的地址(例如' 456 N Other Ave'和456 S Other Ave')所以我不想完全忽略这个方向,但是我想将街道的方向用作辅助合并列,仅在存在重复地址时使用,否则将被忽略。有没有办法做到这一点?

我合并的两列是full_adddir,分别有'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]
})

1 个答案:

答案 0 :(得分:1)

这样做的一种方法就是加入" 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