基于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
相关产品推荐
相关产品推荐

