python中是否有方法匹配字符串中的通配符值

pdkcd3nj  于 2021-08-20  发布在  Java
关注(0)|答案(2)|浏览(382)

我有两张table:
报表
Map表。

“version”列在这两个表中都很常见。
我试图在excel中执行类似于vlookup的功能。i、 e.对于报告表中的每个产品,我希望使用“版本”作为键,并从Map表中获取“答案”的值。
期望输出:

我正在使用以下代码执行此任务:


# import pandas

import pandas as pd
import csv

# read csv data

df1 = pd.read_csv('report.csv')
df2 = pd.read_csv('mapper.csv')

left_join = pd.merge(df1,
                    df2,
                    on ='Version',
                    how ='left')
print(left_join)

下面是我能够通过运行代码生成的输出片段。

然而,问题是我想对产品b说“不”。但是,由于我使用的Map器表具有通配符值“%”,因此无法获得所需的结果。i、 e.如果我想引用版本8.0.2510.8或8.0.2510.1000,我的Map器有一个通用字符串8.0.2510.%。我无法更改Map器。
如何使用通配符值执行字符串Map?
代码可以修改。使用Pandas是没有必要的。使用列表或字典的解决方案也可以

whitzsjs

whitzsjs1#

我试图创建一个附加的专栏,其中有一个“伟大的共同因素版本”,并称之为 gcf_version . 它只是简单地将点号后面的最后一个字段删除 Version .

import pandas as pd
import csv

def removeLast(str):
  return '.'.join(str.split('.')[:-1])

# read csv data

df1 = pd.read_csv('report.csv')
df2 = pd.read_csv('mapper.csv')

df1['gcf_version'] = df1['Version'].map(removeLast)
df2['gcf_version'] = df2['Version'].map(removeLast)

left_join = pd.merge(df1, df2, on ='gcf_version', how ='left')
print(left_join)

输出如下:

Product   Version_x gcf_version   Version_y Answer
0       A     6.0.270        6.0     6.0.270    Yes
1       B  8.0.2510.8   8.0.2510  8.0.2510.%     No

你现在可以选择放弃什么和保留什么。

js5cn81o

js5cn81o2#

我提出了这个解决方案,因为我找不到一种方法来直接在正则表达式上合并/加入2个 Dataframe 。

import pandas as pd

mapper = {'Version': ['6.0.270', '8.0.2510.%'],
          'Answer': ['Yes', 'No']}
report = {'Product': ['A', 'B'],
          'Version': ['6.0.270', '8.0.2510.8']}

mapper_df = pd.DataFrame(mapper)
report_df = pd.DataFrame(report)

Map器

Version Answer
0     6.0.270    Yes
1  8.0.2510.%     No

报告

Product     Version
0       A     6.0.270
1       B  8.0.2510.8

这里我添加了一个新列,而不是使用 replace() 函数在上添加匹配值 Answer 基于正则表达式的列之间的匹配 Version 柱。注意,我已经替换了 % 具有 * 创建一个合适的正则表达式。

mapper_df['Version'] = mapper_df['Version'].map(lambda x: str(x).replace("%", "*"))

to_replace = mapper_df.Version.values.tolist()
values = mapper_df.Answer.values.tolist()

report_df["new"] = report_df['Version'].replace(to_replace, values, regex=True)

print(report_df)

输出

Product     Version  new
0       A     6.0.270  Yes
1       B  8.0.2510.8   No

编辑
注意:此解决方案旨在通过提供的示例数据解决提供的问题。如果存在其他不同的通配符场景,则需要相应地更新正则表达式构建。只需更新更新的这一行 Version 列具有有效的匹配正则表达式。

mapper_df['Version'] = mapper_df['Version'].map(lambda x: str(x).replace("%", "*"))

相关问题