【问题标题】:Remove String Labels from every Row从每一行中删除字符串标签
【发布时间】:2026-01-24 15:45:01
【问题描述】:

我正在使用 pandas 读取 csv 列,其中每一行的格式如下:

IP: XXX:XX:XX:XXX

为了摆脱IP: 前缀,我在事后编辑该列:

logs['ip'] = logs['ip'].str[4:]

有没有办法在read_csv 中执行此操作,可能使用正则表达式,以避免后期计算?

更新 | 考虑这种情况,其中有多个列具有这些前缀 - 有没有更好的方法?

logs['mac'] = logs['mac'].str[5:] logs['id'] = logs['id'].str[4:] logs['lan'] = logs['lan'].str[5:] logs['ip'] = logs['ip'].str[4:]

【问题讨论】:

  • 我不这么认为,IMO 我认为这是最好的方法,因为它是矢量化的并且应该很快
  • 你能举例说明有什么以及你想用正则表达式搜索什么吗?
  • @apgp88 我用更具体的场景更新了这个问题。

标签: python regex csv pandas data-cleaning


【解决方案1】:

read_csvconverters 选项可能提供一种有用的方法。假设文件如下所示:

id       address
 1  IP:123.1.1.1
 2  IP:456.1.1.1
 3  IP:789.1.1.1

然后你可以像这样指定'IP:' 应该转换为''(空白):

dct = { 'address': lambda x: x.replace('IP:','') }

df = pd.read_csv( 'foo.txt', delimiter=' *', converters=dct )

   id    address
0   1  123.1.1.1
1   2  456.1.1.1
2   3  789.1.1.1

我忽略了如果IP: 后面有空格,那么您可能会在自己的专栏中阅读IP:,但您应该能够相当容易地调整它来处理它。

【讨论】:

    【解决方案2】:

    您可以将 csv 列转换为字符串,然后在字符串上使用 .split("IP: ")[1] ,该字符串将包含除“IP:”之外的所有内容。我不确定这是否是最好的方法,但这是我想到的。

    str.split("IP":\s")
    

    【讨论】:

    • 我用更具体的场景更新了这个问题。同时为这个替代方案 +1。
    • 我也在考虑同样的思路,但可以将其作为sep= 的一部分包含在内吗?也就是说,告诉read_csv IP: 是一个分隔符和空格。不过我不太清楚如何使用这种语法。
    • 字符串 str 的内容类似于 print(str, sep="IP:\s")。 \s 用于 python 中的任何空白。
    • 这并不容易,您所做的会将IP: 视为单独的分隔符。我们只希望IP: 成为一个组的分隔符。我不知道该怎么做,或者说实话我什至不确定这是可能的。