如何用字典Map和替换Pandas列

piwo6bdm  于 2022-12-16  发布在  其他
关注(0)|答案(3)|浏览(189)

我是编程新手,特别是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是一个空系列。
谁能帮帮我,告诉我我哪部分做错了?

ki0zmccv

ki0zmccv1#

试试这个

import pandas as pd
dic = {'id': [1, 2, 3, 4,5,6],
       'color': ['red', 'yellow', 'green', 'blue','green','white'],
       'status': ['this is equal to the / number 3', 'you should visit the url \n http:13/color/findings/7', 'conver it to a new value',
                  'this is equal to the / number 13',' conver it to a new value','you should visit the url \n http:13/color/findings/6']}
df = pd.DataFrame(dic)
print(df)

#creating a new list (new status)

status1=['this is equal to a number', 'you should visit the corresponding website', 'conver it to a new value',
                  'this is equal to the / number 13',' conver it to a new value','you should visit the url \n http:13/color/findings/6']

df['status'] = status1 # replacing older with new one (colname intact while replacing its contents with newcol)

print('\n',df)
83qze16e

83qze16e2#

我不知道你想修改多少不同的case,但是你可以简单地写一个函数,如果可以找到一个regex模式,就替换status,然后你可以创建一个新的列,并像这样在.apply()中使用更干净的函数。

import pandas as pd
import re

# Create sample data
d = {'color': ['red', 'yellow', 'green'],
     'status': ['"this is equal to the / number 3"', 'you should visit the url \n http:13/color/findings/7',
                'conver it to a new value']}
df = pd.DataFrame(d)

# Define cleaner function
def cleaner(x):
    new_x = re.sub(r'.*( number\s?\d+).*', '"this is equal to a number"', x)

    return new_x

# Create new column with cleaner function
df['status_cleaned'] = df['status'].apply(lambda x: cleaner(x))

print(df)

输出:

| | 地位|状态_已清理|
| - ------|- ------|- ------|
| 无|“这等于/数字3”|“这等于一个数字”|
| 1个|您应该访问网址\n http:13/color/find...|您应该访问网址\n http:13/color/find...|
| 第二章|将其转换为新值|将其转换为新值|
只需向cleaner函数中添加额外的re.sub()行,以用于您想要修改的其他情况。

tv6aics1

tv6aics13#

您可以使用str.replace

dataf["status"]  = (
 dataf["status"]
  .str.replace(r"http\:\d+/color/findings/\d+","website", regex=True)
  .str.replace(r"\d+|/","", regex=True)
)

首先我们将网址替换为网站,然后删除数字和正斜杠。

相关问题