【问题标题】:Place values from another dataframe if aother column is in another column in Python如果另一列在 Python 中的另一列中,则放置另一个数据框中的值
【发布时间】:2019-07-02 07:50:09
【问题描述】:

假设我有一个数据框A,如下所示:

id        full_name
1           ABC Ltd.
2           NY BCD Ltd.
3           SH ZY Ltd.
4           Soho Company

还有另一个数据框B:

name                     id
 ABC
 NY BCD
 SH ZY
 Soho

如果B 中的namefull_name 中,那么我想将id 的值从数据框A 放到Bid 中。 我怎样才能在 Python 中做到这一点?谢谢。

【问题讨论】:

  • 您可以尝试使用p='({})'.format('\\b|\\b'.join(B.name)),然后使用A=A.assign(match=A.full_name.str.extract(p,expand=False)) 来匹配,然后映射或与B 合并...??
  • 谢谢,'\\b|\\b' 在这里代表什么?
  • 用词边界连接每个词\\b

标签: python pandas dataframe


【解决方案1】:

这个带有模糊查找的灵魂怎么样?

import pandas as pd
import difflib 
df1 = pd.DataFrame({"id": [1, 2, 3, 4], "full_name": ["ABC Ltd.", "NY BCD Ltd.", "SH ZY Ltd.", "Soho Company"]})

df2 = pd.DataFrame({"name": ["ABC", "SH ZY", "NY BCD", "Soho"]})

df2["full_name"] = df2["name"].map(lambda x: difflib.get_close_matches(x, df1["full_name"], cutoff=0.5)[0])

df2 = pd.merge(df2, df1, how="left", on="full_name")

查找查找紧密匹配并返回第一个值,仅当至少 50% 的字符串匹配时才给出数学值。

df2 的 end_result 如下所示:

     name     full_name  id
0     ABC      ABC Ltd.   1
1   SH ZY    SH ZY Ltd.   3
2  NY BCD   NY BCD Ltd.   2
3    Soho  Soho Company   4

【讨论】:

  • 谢谢。模糊查找是个好主意。但是我的真实数据出现错误IndexError: list index out of range。也许是因为我的实际是中国人。在这种情况下我们可以使用isin吗?
  • 您在哪一部分得到index out of range 异常?查找difflib.get_close_matches(x, df1["full_name"], cutoff=0.5)[0] 采用第一个匹配的名称,但是当没有匹配时,列表为空,它将尝试访问违反索引的元素的第一个元素。你可以确保它只需要一个元素,如果有一个可用的其他明智的使用 None 值。
  • df2["name"].map(lambda x: difflib.get_close_matches(x, df1["full_name"], cutoff=0.5)[0]),有了这个我得到了index out of range
  • 也许我们也可以使用fuzzywuzzy 并合并两个数据框,请在此处查看:stackoverflow.com/questions/51934474/…
  • matches = df2["name"].map(lambda x: difflib.get_close_matches(x, df1["full_name"], cutoff=0.5)) df2["full_name"] = [match[0] if match else None for match in matches] 尝试像这样拆分查询:您将获得 None 值,这些值在另一帧中不会匹配,但查询更安全
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-28
  • 2021-07-15
  • 2021-06-11
  • 1970-01-01
  • 1970-01-01
  • 2022-01-26
相关资源
最近更新 更多