You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Pandas中匹配列表与DataFrame列并生成状态列?

问题:在Pandas DataFrame中实现IP存在性标记逻辑

需要实现的逻辑:给定一个IP列表,检查列表中的每个IP是否存在于DataFrame的ip列中,存在则标记为Success,不存在则标记为Failed,最终输出包含Status列的结果,需包含所有待检查的IP(包括不在原DataFrame中的)。

附data.csv内容

server,ip
server1,192.168.0.2
data,192.168.0.3
server3,192.168.0.100
server4,192.168.0.10

现有代码

import pandas as pd

l = ['server1','server2']
ip_list = ['192.168.0.2','192.168.0.100','192.168.25.4']

data = pd.read_csv('data.csv')
#count = ip_list.count()

data_filter = data[
    (data['ip'].isin(ip_list) ) 
]

print(data_filter)

当前输出

server             ip
0  server1    192.168.0.2
2  server3  192.168.0.100

期望输出

server             ip   Status
0  server1    192.168.0.2    Success
1  server3  192.168.0.100   Success
2  NA         192.168.25.4  Failed

解决方案

原代码仅筛选出了存在于列表中的IP,丢失了需要标记为Failed的IP。以下是修改后的代码,可实现需求:

import pandas as pd

ip_list = ['192.168.0.2','192.168.0.100','192.168.25.4']

# 读取原数据
data = pd.read_csv('data.csv')

# 将待检查IP列表转为独立DataFrame,确保所有IP都被保留
check_df = pd.DataFrame({'ip': ip_list})

# 左连接原数据,保留所有待检查IP,匹配到的IP会带上server信息
result = pd.merge(check_df, data, on='ip', how='left')

# 根据server列是否为空标记状态
result['Status'] = result['server'].apply(lambda x: 'Success' if pd.notna(x) else 'Failed')

# 将空值替换为"NA",匹配期望输出格式
result['server'] = result['server'].fillna('NA')

# 重置索引(可选,使索引连续)
result = result.reset_index(drop=True)

print(result)

代码逻辑说明

  1. 保留所有待检查IP:将ip_list转为DataFrame,避免原代码中仅筛选存在IP的问题;
  2. 左连接匹配数据:通过pd.merge的左连接方式,确保所有待检查IP都出现在结果中,匹配到原数据的IP会自动带上对应的server值,未匹配到的server列会为NaN;
  3. 标记状态:根据server列是否为空判断IP是否存在,为空则标记Failed,否则标记Success;
  4. 格式调整:将NaN替换为NA,重置索引让输出更规整。

内容的提问来源于stack exchange,提问作者Puneet Dixit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 03:05:24