首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Python中的正则表达式从预定义子字符串列表中替换或更新DataFrame的字符串实例

如何使用Python中的正则表达式从预定义子字符串列表中替换或更新DataFrame的字符串实例
EN

Stack Overflow用户
提问于 2019-11-05 04:31:21
回答 3查看 96关注 0票数 1

DataFrame实例是混合字母数字字符串类型。但是DataFrame中的所有实例都只包含三个字符串中的一个公共子字符串,即普通、后台、僵尸网络。我希望将dataframe的所有实例替换为这3个实例,以便dataframe类型成为绝对类型。

代码语言:javascript
复制
OriginalDF                                  ConvertedDF
To-background flow udp flows                background
To-botnet flow tcp syn packet               botnet
To-normal flow tcp syn packet               normal
To-normal flow tcp flows                    normal
To-botnet flow ack connection established   botnet
To- normal flow tcp flows                   normal
To-background flow tcp flows                background

我尝试过使用一种迭代方法,这很好。

代码语言:javascript
复制
   for i in range(cat_data.shape[0]):

    if( "Background" in cat_data.Label[i]):
        cat_data.Label[i] = "Background"
    elif( "Normal" in cat_data.Label[i]):
        cat_data.Label[i] = "Normal"
    else:
        cat_data.Label[i] = "Botnet"

他们是否有任何标准的或自定义的方式来执行这样的任务,使用正则表达式,它只使用一两条语句,而不是传统的迭代方式?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-11-06 05:48:57

除了@Mad物理学家的解答之外,我还有其他的解决方案。test.csv容器如下所示

代码语言:javascript
复制
Original_DataFrame
To-background flow udp flows 
To-normal flow tcp ack packet flows
To-botnet flow tcp syn packet 
To- normal flow tcp flows
To- botnet flow ack connection
To- normal flow tcp flows
To- background flow tcp flows

解决方案1:使用列表理解。我使用一个转换函数来返回所需的字符串。我提出这个解决方案是为了证明有多种方法可以做到。选一个最适合你的。

代码语言:javascript
复制
import pandas as pd

def convert_string(string):
    if 'background' in string:
        return 'background'
    elif 'normal' in string:
        return 'normal'
    elif 'botnet' in string:
        return 'botnet'
    else :
        return 'Nan'

df = pd.read_csv('test.csv')
df['New_DataFrame'] =  [ convert_string(string) for string in df['Original_DataFrame']]
print(df)

解决方案2:使用熊猫习语。如果-那么使用.loc

代码语言:javascript
复制
import pandas as pd
df = pd.read_csv('test.csv')
df['New_DataFrame'] = "XXX"
df.loc[df.Original_DataFrame.str.contains('normal'), 'New_DataFrame'] = 'normal'
df.loc[df.Original_DataFrame.str.contains('botnet'), 'New_DataFrame'] = 'botnet'
df.loc[df.Original_DataFrame.str.contains('background'), 'New_DataFrame'] = 'background'
票数 1
EN

Stack Overflow用户

发布于 2019-11-05 06:46:07

由于您正在使用regex,所以可以使用捕获组提取所需的文本:

代码语言:javascript
复制
df['data'].str.replace('.*(normal|background|botnet).*', '\\1')

替换字符串中类似于\1的反向引用允许您引用捕获组的内容。

票数 0
EN

Stack Overflow用户

发布于 2019-11-05 04:47:19

使用应用函数:看看这个Remove opening and closing parenthesis with word in pandas

只是伪代码

代码语言:javascript
复制
def f(x):
    apply regex like re.findall(exp,x)
    nested if else
    check if val == value 1:
         return something
    other if else condition

df['label'] = df['label'].apply(f)
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58704537

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档