使用Python Pandas过滤CSV多变量时遇代码问题求助
问题修复:Adult数据集处理代码调整
原代码核心问题梳理
- 变量名不统一:读取数据赋值给
df,后续却用未定义的data调用,触发NameError - 字符串拼接语法错误:跨多行拼接字符串未加
\,导致代码无法编译 - 字符串常量未加引号:
Male是字符串值,未加引号会被识别为变量,触发NameError - 多条件过滤语法错误:布尔索引的多条件需要用括号包裹后再用
&连接,否则运算优先级出错 - 循环效率极低:用
iterrows()逐行统计组合次数,大数据集下性能极差
修复后的完整代码
import pandas as pd import numpy as np # 读取数据,统一使用变量名df df = pd.read_csv("adult.data.csv") # 输出数据基本信息,用f-string替代字符串拼接更简洁 print(f"data shape: {df.shape}") print(f"number of rows: {df.shape[0]}") print(f"number of cols: {df.shape[1]}") print(df.columns.values) # 用pandas内置分组方法统计指定列的组合出现次数,性能远超循环 combination_counts = df.groupby(['age', 'sex', 'workclass', 'education', 'marital-status', 'race']).size() # 统计仅出现一次的组合数量 unique_row_count = len(combination_counts[combination_counts == 1]) print(unique_row_count) # 打印所有仅出现一次的组合 for combo, count in combination_counts[combination_counts == 1].items(): print(combo) # 正确的多条件过滤写法:括号包裹单个条件,字符串值加引号,用&连接逻辑与 filtered_data = df.loc[(df['age'] == 58) & (df['sex'] == 'Male')] print(filtered_data)
关键修复说明
- 变量名统一:将所有
data替换为df,避免未定义变量错误 - 语法错误修正:给字符串常量
Male添加引号,修复跨行字符串拼接的语法问题 - 多条件过滤优化:用括号包裹每个过滤条件,确保
&的逻辑运算优先级正确 - 性能提升:用
groupby().size()替代逐行循环,利用pandas向量化操作特性,处理大数据集时性能提升数十倍甚至百倍
内容的提问来源于stack exchange,提问作者Coding Noob
相关产品推荐
相关产品推荐

