通过子字符串过滤器将外部数据帧数据添加到另一个数据帧
Adding external datraframe data, via substring filter, to another dataframe
Python 菜鸟在这里。非常尊重你们。希望能帮到你。
我有两个 pandas 数据帧,df1
和 df2
:
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_name
和 style_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”),我们可以执行以下步骤:
- 将列添加到
df2
,并从 df2.project_name
中提取正则表达式匹配(或不匹配);
- 检查这些匹配项是否存在于
df1
中(冗余,如果你能确定的话);
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
Python 菜鸟在这里。非常尊重你们。希望能帮到你。
我有两个 pandas 数据帧,df1
和 df2
:
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_name
和 style_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”),我们可以执行以下步骤:
- 将列添加到
df2
,并从df2.project_name
中提取正则表达式匹配(或不匹配); - 检查这些匹配项是否存在于
df1
中(冗余,如果你能确定的话); 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