通过子字符串过滤器将外部数据帧数据添加到另一个数据帧

Adding external datraframe data, via substring filter, to another dataframe

Python 菜鸟在这里。非常尊重你们。希望能帮到你。

我有两个 pandas 数据帧,df1df2:

df1:

style_gid style_name
0 1202357372219055 DIA
1 1202357372219056 WVU
2 1202357372219057 GWE

df2:

project_gid project_name
0 1202318051699659 Project Master
1 1202318100865244 TEST-DIA-LON-1
2 1202320766191762 TEST-WVU-LONMUN-1
3 1202381389399069 TEST-DIA-MUN-2
4 1202381389399070 Custom Section

而且我尝试了很多东西,很多。我需要找出如何检查 df2 的每一行中的 project_name 以查看它是否与 df1 中的 style_name 条目之一匹配。如果那是真的,然后 以某种方式 style_namestyle_id 带入 df2,就像下面的 table.

规则是,如果 style_name 中的文本在 'project_name' 中的文本中的 任何地方 中找到,那就是一个匹配项,因此该项目应该是分配了相关样式。

例如,上面的项目名称包含两个与 'DIA' 匹配的示例,以及一个与 'WVU' 匹配的示例:
测试-DIA-LON-1
测试-WVU-LONMUN-1
测试-DIA-MUN-2

样式数据框是一个移动的目标,列表将更改 style_name 的值和条目数(即我们最终可能会使用其他 'ABC'、'XYX',无论以及),但搜索将始终以大写形式搜索 3 个字母的字符串。

任何与样式不匹配的内容都会返回 null 或 none,或 'Potato',我不介意,我可以稍后处理。

我不知道如何执行这个lookup/insert,尽管找到了几个测试名称的解决方案。有人可以帮忙吗?

因此生成的数据帧 df2 最终看起来像这样:

project_gid project_name style_gid style_name
0 1202318051699659 Project Master None/Null None/Null
1 1202318100865244 TEST-DIA-LON-1 1202357372219055 DIA
2 1202320766191762 TEST-WVU-LONMUN-1 1202357372219056 WVU
3 1202381389399069 TEST-DIA-MUN-2 1202357372219057 DIA
4 1202381389399070 Custom Section None/Null None/Null

或者到一个新的数据框,只要每个项目都得到它应有的风格。

前提是我们一直在寻找模式 ABC 第一个 匹配,前面有一个 -,后面有另一个 - (因此,永远不要在“TEST-DIA-LON-1”中使用“LON”),我们可以执行以下步骤:

  1. 将列添加到 df2,并从 df2.project_name 中提取正则表达式匹配(或不匹配);
  2. 检查这些匹配项是否存在于 df1 中(冗余,如果你能确定的话);
  3. df2.merge 添加 df1.style_gid(并重新排列列以匹配您的
import pandas as pd
import numpy as np

# we have 2 dfs: df1 (style), df2 (project)

# regex to capture first match of pattern like 'ABC' preceded by '-' and followed by '-'
pattern = r"(?<=-)([A-Z]{3})(?=-)"

# use str.extract() to populate new col with all found matches
df2['style_name'] = df2['project_name'].str.extract(pattern)

# lambda to ensure that all your matches actually exist as 'ABC's in df1, else 'NaN'
df2['style_name'] = df2['style_name'].apply(lambda i: i if i in list(df1.style_name) else np.nan)

# merge on df1 to get matches for df1.style_gid
df2 = df2.merge(df1, how='left')

# rearrange last two cols
df2 = df2.iloc[:, [0,1,3,2]]

输出print(df2):

    project_gid       project_name     style_gid style_name
0  1.202320e+15     Project Master           NaN        NaN
1  1.202320e+15     TEST-DIA-LON-1  1.202360e+15        DIA
2  1.202320e+15  TEST-WVU-LONMUN-1  1.202360e+15        WVU
3  1.202380e+15     TEST-DIA-MUN-2  1.202360e+15        DIA
4  1.202380e+15     Custom Section           NaN        NaN