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

如何使用Python中的正则表达式替换或更新预定义子字符串列表中数据帧的字符串实例,python,pandas,replace,substring,Python,Pandas,Replace,Substring,数据帧实例是字母数字混合字符串类型。但是数据帧中的所有实例只包含三个字符串中的一个公共子字符串,即正常、背景、僵尸网络。我想将dataframe的所有实例替换为这3个实例,以便dataframe类型成为分类类型 OriginalDF ConvertedDF To-background flow udp flows background To-botnet flow tcp syn packet

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

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"
他们是否有任何标准的或定制的方法来执行这样的任务,使用只使用一个或两个语句的正则表达式,而不是传统的迭代方式?

使用apply函数: 看看这个

这只是伪代码

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)
使用应用功能: 看看这个

这只是伪代码

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)

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

df['data'].str.replace('.*(normal|background|botnet).*', '\\1')

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

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

df['data'].str.replace('.*(normal|background|botnet).*', '\\1')

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

除了@Mad physical提供的解决方案外,我还有其他解决方案。 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: 使用列表理解。 我正在使用convert函数返回所需的字符串。 我提出这个解决方案是为了证明有多种方法可以做到这一点。 挑一个最适合你的

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'

除了@Mad Physician的解,我还有其他解。 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: 使用列表理解。 我正在使用convert函数返回所需的字符串。 我提出这个解决方案是为了证明有多种方法可以做到这一点。 挑一个最适合你的

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'


我认为您的迭代方法在这种情况下会起作用。但这是一种迭代方法,循环列的每一行。在这种情况下,您是否提供了关于使用replace函数的任何建议/信息?我认为您的迭代方法在这种情况下会起作用。但这是一种迭代方法,循环列的每一行。在这种情况下,您是否提供了有关使用替换功能的任何建议/信息?您是否可以提供文本格式的数据,以便我可以使用它来检查我是否可以提出更优化的方案?@nitin3685实际上,数据集非常大。您可以制作一个数据框,由问题中的图中的数据组成,并使用子字符串(多个)进行过滤。请详细说明“不工作”。如果没有进一步的解释,那句话毫无意义。@SofiUllahSaikat。如果你用评论的内容替换图片,那将非常有帮助。问题不应涉及您的全部数据。它们必须包含最少的可复制示例。@nitin3685感谢您的回复。事实上,我是ML的新手,如果有什么事情看起来很简单,请先做一个解释,然后复制,做任何你想做的事情。但如果你发表评论,对于像我这样的新手来说,更好地探索会很有帮助。你能以文本格式提供你的数据吗?这样我就可以用它来检查我是否能提出更优化的方案?@nitin3685实际上,数据集的规模很大。您可以制作一个数据框,由问题中的图中的数据组成,并使用子字符串(多个)进行过滤。请详细说明“不工作”。如果没有进一步的解释,那句话毫无意义。@SofiUllahSaikat。如果你用评论的内容替换图片,那将非常有帮助。问题不应涉及您的全部数据。它们必须包含最少的可复制示例。@nitin3685感谢您的回复。事实上,我是ML的新手,如果有什么事情看起来很简单,请先做一个解释,然后复制,做任何你想做的事情。但是如果你发表评论,对于像我这样的新手来说,更好地探索会很有帮助。先生,这句话表明meTypeError:replace()得到了一个意外的关键字参数“inplace”。@SofiUllahSaikat。请仔细阅读评论,并更新您的问题。我认为所述问题(更新)具有理解问题所需的所有澄清。如果您找到了任何解决方案,请告诉我方法。谢谢,谢谢大家这么好。我真的很感激你。“看到那些我认为很难解决的简单解决办法,我自己觉得自己真的很愚蠢。”索菲奥拉·萨伊卡特。感谢您抽出时间更新您的问题。我现在改变了我的投票。通过单击旁边的复选标记来选择适合您的答案是一种很好的礼仪,这样您的问题就不会再被标记为未回答。我很高兴你喜欢这里的经历。快乐编码!先生,此语句显示meTypeError:replace()得到了一个意外的关键字参数“inplace”。@SofiUllahSaikat。请仔细阅读评论,并更新您的问题。我认为所述问题(更新)具有理解问题所需的所有澄清。如果您找到了任何解决方案,请告诉我方法。谢谢,谢谢大家这么好。我真的很感激你。“看到那些我认为很难解决的简单解决办法,我自己觉得自己真的很愚蠢。”索菲奥拉·萨伊卡特。感谢您抽出时间更新您的问题。我现在改变了我的投票。通过单击旁边的复选标记来选择适合您的答案是一种很好的礼仪,这样您的问题就不会再被标记为未回答。我很高兴你喜欢这里的经历。快乐编码!第二个解决方案就像我预期的那样棒极了。非常感谢您的努力。第二个解决方案就像我期望的那样棒极了。非常感谢