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

问题描述

DataFrame 实例是混合字母数字字符串类型。但是 DataFrame 中的所有实例仅包含三个字符串中的一个公共子字符串,即normal、background、botnet。我想将数据框的所有实例替换为这 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"

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

标签: pythonpandasreplacesubstring

解决方案


除了@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:使用熊猫习语。如果-那么.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'

推荐阅读