我是编程新手,特别是regex。我遇到了一个将字典项Map到Pandas Dataframe 列的问题。
一个最小可重复性示例如下(我的原始数据集很大):
我的csv文件看起来像:
| 身份证|颜色|地位|
| - ------|- ------|- ------|
| 一个|红色|“这等于/数字3”|
| 第二章|黄色|你应该访问网址\n http:13/color/founds/7|
| 六十七|绿色|将其转换为新值|
| 七|蓝色|“这等于/数字13”|
| 八个|绿色|将其转换为新值|
| 二十三|白色|你应该访问网址\n http:13/color/founds/67|
我希望得到的结果是将每个元素的状态修改为更通用:
| 身份证|颜色|地位|
| - ------|- ------|- ------|
| 1个|红色|“这等于一个数字”|
| 第二章|黄色|您应该访问相应的网站|
| 六十七|绿色|将其转换为新值|
| 七|蓝色|“这等于一个数字”|
| 八个|绿色|将其转换为新值|
| 二十三|白色|您应该访问相应的网站|
我想使用的方法是创建一个字典,其中键和值是对应的状态注解,并替换它们:
my_dict = {
'"this is equal to the \/ number \d+"' : '"this is equal to a number"',
'you should visit the url \\n http:\d+\/color\/findings\/\d+' : 'you should visit the corresponding website',
'conver it to a new value' : 'conver it to a new value'
}
那么对于第一种方法,我尝试用Map来代替它们:
df['status'] = [next((v for k,v in my_dict.items() if k in x), float('nan')) for x in df['status'].tolist()]
它只给出了与原始键值相似的状态:“将其转换为新值”
我也尝试过:
dictkeys_pattern = re.compile('|'.join(my_dict), re.IGNORECASE)
status_found = df['status'].str.findall(my_dict)
stat = []
for i in status_found:
for k, v in my_dict.items():
if re.match(k, i, re.IGNORECASE):
stat.append(v)
else:
stat = None
if status_found:
stat = []
for i in status_found:
for k, v in my_dict.items():
if re.match(k, i, re.IGNORECASE):
stat.append(v)
else:
stat = None
但是,status_found是一个空系列。
谁能帮帮我,告诉我我哪部分做错了?
3条答案
按热度按时间ki0zmccv1#
试试这个
83qze16e2#
我不知道你想修改多少不同的case,但是你可以简单地写一个函数,如果可以找到一个regex模式,就替换status,然后你可以创建一个新的列,并像这样在
.apply()
中使用更干净的函数。输出:
| | 地位|状态_已清理|
| - ------|- ------|- ------|
| 无|“这等于/数字3”|“这等于一个数字”|
| 1个|您应该访问网址\n http:13/color/find...|您应该访问网址\n http:13/color/find...|
| 第二章|将其转换为新值|将其转换为新值|
只需向cleaner函数中添加额外的
re.sub()
行,以用于您想要修改的其他情况。tv6aics13#
您可以使用
str.replace
首先我们将网址替换为网站,然后删除数字和正斜杠。