python - Pandas 在列上与可选的辅助列合并

标签 python pandas dataframe merge

我有两个来自两个不同来源的 pandas 数据框,它们都包含建筑物地址,我想合并它们。我遇到的问题是,两组地址的记录方式并不完全相同。具体来说是街道的方向(“N”、“E”、“S”、“W”)。

一组中的某些地址有方向,而其他地址没有,因此,如果我使用方向作为合并列,一些匹配的地址不会合并在一起(例如一组中的“123 Main St”和一组中的“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]
})

最佳答案

实现此目的的一种方法是仅加入“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/

相关文章:

python - 带有空格或特殊字符的 Bokeh 工具提示名称

Python Pandas : convert list of objects to a list of integer

python - 获取 pandas 中连续行中唯一值的个数

r - 根据列名称绑定(bind)数据框(超过 10^8 列)的最有效方法

python - 在 Pandas 数据框中删除特定的 multiIndex 列

Python 对象代理 : how to access proxy

python - 服务器响应中的 BOM 搞砸了 json 解析

python - Matplotlib:如何将时间戳与 broken_barh 一起使用?

Python Pandas Lambda : Using multiple variables Lambda within DataFrame

重复 data.frame 的行