Python 如何替换熊猫中的值?

Python 如何替换熊猫中的值?,python,pandas,dataframe,Python,Pandas,Dataframe,尝试将第二列最后一列中的23个不同标签分为四组。请注意,在执行此操作之前,我已删除csv的最后一列 我已使用读取.csv文件 df = pd.read_csv('KDDTrain+.csv', header=None, names = col_names) 在哪里 如果我打印出数据框的前5行,这就是输出(请注意“标签”列): 使用打印(测向头(5)) 我已经尝试了这两种方法,根据我在网上找到的内容进行分组: 方法1: df.replace(to_replace = ['ipsweep.', '

尝试将第二列最后一列中的23个不同标签分为四组。请注意,在执行此操作之前,我已删除csv的最后一列

我已使用读取.csv文件

df = pd.read_csv('KDDTrain+.csv', header=None, names = col_names)
在哪里

如果我打印出数据框的前5行,这就是输出(请注意“标签”列):

使用
打印(测向头(5))

我已经尝试了这两种方法,根据我在网上找到的内容进行分组:

方法1:

df.replace(to_replace = ['ipsweep.', 'portsweep.', 'nmap.', 'satan.'], value = 'probe', inplace = True)
df.replace(to_replace = ['ftp_write.', 'guess_passwd.', 'imap.', 'multihop.', 'phf.', 'spy.', 'warezclient.', 'warezmaster.'], value = 'r2l', inplace = True)
df.replace(to_replace = ['buffer_overflow.', 'loadmodule.', 'perl.', 'rootkit.'], value = 'u2r', inplace = True)
df.replace(to_replace = ['back.', 'land.' , 'neptune.', 'pod.', 'smurf.', 'teardrop.'], value = 'dos', inplace = True)
方法2:

df['label'] = df['label'].replace(['ipsweep.', 'portsweep.', 'nmap.', 'satan.'], 'probe',regex=True)
df['label'] = df['label'].replace(['ftp_write.', 'guess_passwd.', 'imap.', 'multihop.', 'phf.', 'spy.', 'warezclient.', 'warezmaster.'], 'r2l',regex=True)
df['label'] = df['label'].replace(['buffer_overflow.', 'loadmodule.', 'perl.', 'rootkit.'], 'u2r',regex=True)
df['label'] = df['label'].replace(['back.', 'land.' , 'neptune.', 'pod.', 'smurf.', 'teardrop.'], 'dos',regex=True)
但是,这仍然是打印数据帧前5行的输出:

After replacing, first 5 rows of df: 

   duration protocol_type  ... dst_host_srv_rerror_rate    label
0         0           tcp  ...                     0.00   normal
1         0           udp  ...                     0.00   normal
2         0           tcp  ...                     0.00  neptune
3         0           tcp  ...                     0.01   normal
4         0           tcp  ...                     0.00   normal
我希望第2行中的标签列显示的是“dos”而不是“neptune”,但事实并非如此

我做错了什么?非常感谢您的帮助。

也许您使用的是
“海王星”。
而不是
“海王星”

我的测试似乎与
“海王星”

>>df
标签
0海王星
>>>df[“标签”]。替换([“海王星”],“正常”,正则表达式=True)
0海王星
名称:标签,数据类型:对象
>>>df[“标签”]。替换([“海王星”],“正常”,正则表达式=真)
0正常
名称:标签,数据类型:对象
>>>df[“标签”]。替换([“海王星”],“正常”)
0正常
名称:标签,数据类型:对象
通过使用
“neptune.”
作为
替换
值为
regex=True
,您告诉熊猫寻找
“neptune”
和任何单个附加字符(例如,“neptuneX”或“neptune!”)。由于该额外字符不存在,因此整个短语不会被替换。相反,您可以只使用
“neptune”
,或
“neptune.?”
表示0个或1个额外字符,或
“neptune.*”
表示0个或更多额外字符


如果没有
regex=True
,你是在告诉熊猫去寻找字面意义上的
“海王星。”
短语。

这很有效,但我不知道为什么。不管怎样,非常感谢你!
df['label'] = df['label'].replace(['ipsweep.', 'portsweep.', 'nmap.', 'satan.'], 'probe',regex=True)
df['label'] = df['label'].replace(['ftp_write.', 'guess_passwd.', 'imap.', 'multihop.', 'phf.', 'spy.', 'warezclient.', 'warezmaster.'], 'r2l',regex=True)
df['label'] = df['label'].replace(['buffer_overflow.', 'loadmodule.', 'perl.', 'rootkit.'], 'u2r',regex=True)
df['label'] = df['label'].replace(['back.', 'land.' , 'neptune.', 'pod.', 'smurf.', 'teardrop.'], 'dos',regex=True)
After replacing, first 5 rows of df: 

   duration protocol_type  ... dst_host_srv_rerror_rate    label
0         0           tcp  ...                     0.00   normal
1         0           udp  ...                     0.00   normal
2         0           tcp  ...                     0.00  neptune
3         0           tcp  ...                     0.01   normal
4         0           tcp  ...                     0.00   normal