如何在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)
代码逻辑说明
- 保留所有待检查IP:将
ip_list转为DataFrame,避免原代码中仅筛选存在IP的问题; - 左连接匹配数据:通过
pd.merge的左连接方式,确保所有待检查IP都出现在结果中,匹配到原数据的IP会自动带上对应的server值,未匹配到的server列会为NaN; - 标记状态:根据
server列是否为空判断IP是否存在,为空则标记Failed,否则标记Success; - 格式调整:将
NaN替换为NA,重置索引让输出更规整。
内容的提问来源于stack exchange,提问作者Puneet Dixit
相关产品推荐
相关产品推荐

