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

基于Pandas DataFrame不同列不同数据类型的条件判断问题

问题原因分析

你的代码核心错误在于遍历逻辑完全错误:

  • 循环取的是df['login']的单个数值i,但后续判断i in df['operatingsystem'].str.lower().str.contains("server")根本不成立——i是整数,而str.contains返回的是布尔值组成的Series(每行对应一个True/False),整数不可能匹配到布尔值里,所以永远走else分支,导致servercount始终为0。
修复方案

方案1:按行遍历(保留循环逻辑)

直接遍历DataFrame的行,同时获取每行的login和operatingsystem值:

import pandas as pd

servercount = 0
othercount = 0

df = pd.DataFrame({
    'operatingsystem': ['Windows 7', 'Windows Server 2012', 'Windows Server 2012 R', 
                'macOSX', 'Linux Server'],
    'login': [9, 12, 5, 11, 19],
})

# 按行遍历,同时获取每行的login和操作系统值
for _, row in df.iterrows():
    login_num = row['login']
    os_name = row['operatingsystem']
    if login_num > 10:
        if 'server' in os_name.lower():
            servercount += 1
        else:
            othercount += 1

print("Servers:", servercount, "\nOthers:", othercount)

运行结果:

Servers: 2 
Others: 1

(符合预期:login>10的行共3行,其中2行操作系统包含server,1行是macOSX)

方案2:用Pandas向量化操作(更高效,推荐)

Pandas不推荐逐行循环,向量化操作在大数据集下性能优势明显,代码也更简洁:

import pandas as pd

df = pd.DataFrame({
    'operatingsystem': ['Windows 7', 'Windows Server 2012', 'Windows Server 2012 R', 
                'macOSX', 'Linux Server'],
    'login': [9, 12, 5, 11, 19],
})

# 先筛选出login>10的行
filtered_rows = df[df['login'] > 10]
# 统计包含server的行数(布尔值求和会把True算1,False算0)
servercount = filtered_rows['operatingsystem'].str.lower().str.contains('server').sum()
# 其他数量=筛选后总行数 - server数量
othercount = len(filtered_rows) - servercount

print("Servers:", servercount, "\nOthers:", othercount)

运行结果和方案1一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 12:50:18