我有两张桌子:
列“版本”在两个表中都很常见。
我试图在Excel中执行类似于VLOOKUP的功能。也就是说,对于报告表中的每个产品,我都希望使用“Version”作为我的键,并从Mapper表中获得“答案”的值。
期望产出:
我正在使用下面的代码来执行任务:
# 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使用“否”,但是由于我使用的映射表有一个通配符值"%",所以我无法获得所需的结果。也就是说,如果我想引用一个版本8.0.2510.8或,则映射器具有一个泛型字符串8.0.2510.%。我不能改变地图。
如何执行字符串与通配符值的映射?
代码可以修改。使用熊猫是不必要的。使用列表或字典的解决方案也很好。
发布于 2021-07-10 11:27:22
我想出了这个解决方案,因为我找不到一种直接在regex上合并/连接2只熊猫的方法。
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)
mapper_df
Version Answer
0 6.0.270 Yes
1 8.0.2510.% No
report_df
Product Version
0 A 6.0.270
1 B 8.0.2510.8
这里,我将添加一个新列,而不是通过使用replace()
函数来根据Answer
列之间的regex匹配在Answer
列上添加匹配值来连接2个数据格式。请注意,我已将%
替换为*
,以创建适当的正则表达式。
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
编辑
注意:此解决方案是为了解决所提供的问题而提供的示例数据。如果有其他不同的外卡场景,需要相应地更新regex构建。只需更新这一行,更新后的Version
列有一个有效的匹配正则表达式。
mapper_df['Version'] = mapper_df['Version'].map(lambda x: str(x).replace("%", "*"))
发布于 2021-07-10 11:50:03
我尝试创建一个附加列,并将其命名为“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
现在你可以选择放下什么,保留什么。
https://stackoverflow.com/questions/68330560
复制