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

DataFrame实例是混合的字母数字字符串类型。但是,DataFrame中的所有实例仅包含三个字符串中的一个公共子字符串,这三个字符串分别是正常,背景,僵尸网络。我想将数据框的所有实例替换为这3个实例,以使数据框类型成为分类。

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

我尝试使用迭代方法,效果很好。

   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"

他们使用正则表达式执行这种任务的任何标准或定制方式是否仅使用一个或两个语句,而不是传统的迭代方式来完成这项工作?

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

除了@Mad Physicist的解决方案之外,我还有其他解决方案。 test.csv容器以下

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: 使用列表理解。 我正在使用转换函数返回所需的字符串。 我已经提出了这种解决方案,以证明有多种方法可以做到这一点。 选择最适合您的一种。

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:使用熊猫习语。 if-then与.loc

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'
,

由于使用正则表达式,因此可以使用捕获组提取所需的文本:

DT_PM

通过替换字符串中的df['data'].str.replace('.*(normal|background|botnet).*','\\1') 之类的反向引用,您可以引用捕获组的内容。

,

使用套用功能: 看看这个Remove opening and closing parenthesis with word in pandas

那只是伪代码

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)
本文链接:https://www.f2er.com/3162268.html

大家都在问