【问题标题】:Merge data frames based on substrings- python基于子字符串合并数据帧-python
【发布时间】:2021-05-02 02:43:57
【问题描述】:

我有两个数据框,我想根据一个 df 中的列进行合并,第二个 df 中有子字符串,我该怎么做?

这是第一个数据帧

Flower     Id     city 
Jasmine 1023 hawai
Lotus   3405 st Jose
BudRose 4409 Miami
Lily    2457 Washington 

第二个数据帧

Flower   Id         city 
Jasmine 1023LD Hawai
Lily    2457MH Washington
Lily    3346HK Washington

我需要通过FlowercityId 的前 4 个字符合并这些 从而 2nd lily 不应该出现在结果中。

合并后的数据集应如下所示

Flower   Id         city 
Jasmine 1023LD Hawai
Lily    2457MH Washington

如何使用子字符串进行合并?

谢谢!!

【问题讨论】:

  • 实际上第二个 Lotus 看起来应该和第一个 Lotus 一样。是的,让我试试看如何拆分成列,
  • 完成了,如何将数据框放入标签或其他内容中,使其看起来像列而不是字符串
  • 完成请看
  • 并非如此。第二个 Lilys Id 在第一个数据框中没有匹配的 Id..
  • 对于合并,两个数据帧之间的花朵相同,城市相同,Id 的前 4 个字符应该相同...希望有意义..

标签: python pandas substring


【解决方案1】:

对于合并 IdFlower 列的前 4 个字符的 substr,请尝试以下操作:

import pandas as pd

df1 = pd.DataFrame({'Flower': ["Jasmine", "Lotus", "BudRose", "Lily"],
                    'Id': ["1023", "3405", "4409", "2457"],
                    'City': ["Hawai", "St Jose", "Miami", "Washington"]})
df2 = pd.DataFrame({'Flower': ["Jasmine", "Lily", "Lily"],
                    'Id': ["1023LD", "2457MH", "3346HK", ],
                    'City': ["Hawai", "Washington", "Washington"]})


def get_substr(x):
    return x['Id'].str[:4]


merged_df = df1.assign(merge_with_x=get_substr) \
    .merge(df2.assign(merge_with_x=get_substr),
           on=['Flower', 'City', 'merge_with_x'],
           suffixes=['_x', '/z']) \
    .filter(regex=r'Flower|City|.*/z')

# Fix Column Names
merged_df.columns = merged_df.columns.str.rstrip('/z')

# Fix Column Order
merged_df = merged_df[['Flower', 'Id', 'City']]

print(merged_df)

输出:

花城 0 茉莉花 1023LD 夏威夷 1 百合 2457MH 华盛顿

工作原理

将列添加到 DF 以及所需的子字符串:

def get_substr(x):
    return x['Id'].str[:4]

print(df1.assign(merge_with_x=get_substr))
print(df2.assign(merge_with_x=get_substr))
花 ID 城市 merge_with_x 0 茉莉花 1023 夏威夷 1023 1 莲花 3405 圣何塞 3405 2 BudRose 4409 迈阿密 4409 3 莉莉 2457 华盛顿 2457 花 ID 城市 merge_with_x 0 茉莉花 1023LD 夏威夷 1023 1 百合 2457MH 华盛顿 2457 2 百合 3346HK 华盛顿 3346

在 Flower 和 substr 上合并:

print(df1.assign(merge_with_x=get_substr)
      .merge(df2.assign(merge_with_x=get_substr),
             on=['Flower', 'City', 'merge_with_x'],
             suffixes=['_x', '/z']))
花 Id_x 城市 merge_with_x Id/z 0 茉莉花 1023 夏威夷 1023 1023LD 1 莉莉 2457 华盛顿 2457 2457MH

然后过滤掉合并创建的列:

print(df1.assign(merge_with_x=get_substr)
      .merge(df2.assign(merge_with_x=get_substr),
             on=['Flower', 'City', 'merge_with_x'],
             suffixes=['_x', '/z'])
      .filter(regex=r'Flower|City|.*/z'))
花城id/z 0茉莉花夏威夷1023LD 1 莉莉华盛顿 2457MH

最后清理列名和顺序:

merged_df.columns = merged_df.columns.str.rstrip('/z')
merged_df = merged_df[['Flower', 'Id', 'City']]

【讨论】:

    【解决方案2】:
    df1.merge(df2.groupby('Flower').first(), how='inner', on='Flower').rename(columns={'Id_y':'Id',
                            'city_y':'city'}).drop(['Id_x', 'city_x'], 1)
    

    输出

        Flower  Id      city
    0   Jasmine 1023LD  Hawai
    1   Lily    2457MH  Washington
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-30
      • 2018-03-18
      • 2018-07-22
      • 2021-01-29
      • 1970-01-01
      • 2021-04-26
      • 1970-01-01
      • 2019-09-02
      相关资源
      最近更新 更多