【问题标题】:Python; Pandas; Drop a row that has invalid IP addressPython;熊猫;删除具有无效 IP 地址的行
【发布时间】:2022-01-28 08:58:13
【问题描述】:

我目前正在使用 netaddr 从 IP 字符串中验证 IP 地址。该字符串中可能包含一些空(nan)值,因此我收到以下错误。

AppData\Local\Programs\Python\Python39\lib\site-packages\netaddr\ip\__init__.py", line 305, in __init__ 
raise AddrFormatError('failed to detect a valid IP ' \
netaddr.core.AddrFormatError: failed to detect a valid IP address from nan

脚本在检测到其第一个无效 IP 地址后立即停止。它不会遍历所有记录。 我希望脚本将错误的行/记录存储在单独的 csv 文件中,并继续验证其余数据。或者脚本可以删除 IP 地址错误的行并继续处理剩余的行。

下面是我从“ip”列验证 IP 地址的实现

def ipvalidate(df):
    ip = df
    for block in ip_network:
            if IPAddress(ip) in IPNetwork(block):
                return 'int'
            else:
                return 'ext'
        

上面的df可能不是字符串(我对python很陌生)。下面是调用 ipvalidate 函数的代码。在(row.ip)下面,ip是我表中的一列

    df['detect_ip'] = df.apply(lambda row: ipvalidate(row.ip), axis=1)

我尝试过 'dropna' 但它一直在抱怨“'dropna' 不适用于字符串”或类似的东西。

任何见解都会非常有帮助。提前致谢

【问题讨论】:

  • 请分享您的数据样本,以便复制

标签: python pandas validation ip-address


【解决方案1】:

我首先想对您的 ipvalidate 函数发表评论。它说这个函数的输入是一个 DataFrame (def ipvalidate(df):),但你只是将一个值传递给这个函数 (ipvalidate(row.ip) ,通过它您正在访问该行的“ip”列中的值)。我认为它仍然可以正常工作,但是让读者感到困惑。我建议您将函数的顶部简化为:

def ipvalidate(ip):
   for block in ip_network:
      ...

关于您的问题,我认为您根本不需要您的功能。以下单行代码也应该可以工作:

df["detect_ip"] = df["ip"].apply(lambda ip: "int" if IPAddress(ip) in IPNetwork(block) else "ext")

【讨论】:

  • 感谢您的建议。我实现了你的代码,发现这个错误``` in f return func(x, *args, **kwargs) TypeError: () got an unexpected keyword argument 'axis' ```你知道我可以改变什么吗?.
  • 是的,我更新了答案中的代码。基本上,如果你将它应用到整个 DataFrame 上,你只需要在“apply”函数中添加“axis”关键字参数(因为它需要知道它应该查看列还是行)。但由于在我的代码中我们将它应用到某个列 (df["ip"]),它已经知道在哪里查找并且不需要“axis”关键字参数。因此,只需删除“axis”关键字参数即可使其工作。
猜你喜欢
  • 2016-12-01
  • 2018-06-18
  • 2017-09-27
  • 2019-11-24
  • 2011-10-22
  • 2014-08-15
  • 2019-11-05
  • 1970-01-01
  • 2021-12-13
相关资源
最近更新 更多