【问题标题】:Pandas merge on column with optional secondary columnPandas 在具有可选辅助列的列上合并
【发布时间】:2017-11-30 21:28:26
【问题描述】:

我有两个来自两个不同来源的 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]
})

【问题讨论】:

    标签: python pandas dataframe merge


    【解决方案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
    

    【讨论】:

    • 啊,完美,我正朝着这样的方向前进,但这要简单得多!
    • 很高兴,我能帮上忙。谢谢。
    猜你喜欢
    • 2021-02-24
    • 2018-01-27
    • 1970-01-01
    • 2016-11-09
    • 2020-10-25
    • 2014-01-18
    • 2021-03-15
    • 1970-01-01
    • 2021-10-25
    相关资源
    最近更新 更多