Pandas按条件删行失败及数据类型转换报错的解决咨询
问题解决方案
一、删除满足条件的行
原方法失效原因
- 方法一:
inplace=False是默认参数,执行后仅返回删除后的新DataFrame,原sample不会被修改。 - 方法二:
drop()默认inplace=False,调用后不修改原数据;且用iterrows()遍历DataFrame时直接修改原数据,容易引发索引混乱,效率也偏低。
正确写法
写法1:直接修改原数据
sample.drop(sample.loc[(sample.service == 'ftp') & (sample.is_ftp_login.isna())].index, inplace=True)
写法2:覆盖原变量(推荐,避免原地修改的潜在问题)
sample = sample.drop(sample.loc[(sample.service == 'ftp') & (sample.is_ftp_login.isna())].index)
更简洁的筛选写法
直接用布尔索引保留不满足条件的行,效率更高:
sample = sample[~((sample.service == 'ftp') & (sample.is_ftp_login.isna()))]
注:~表示逻辑取反,筛选出不满足"service为ftp且is_ftp_login为空"的行。
二、类型转换问题
原代码报错原因
直接用int()转换整个Series是错误的——int()只能处理单个值,无法处理Series数组;此外如果列中存在空值(NaN)或非数值内容,直接转换也会触发报错。
正确转换步骤
import pandas as pd # 1. 将列转换为数值类型,非数值内容转为NaN sample['ct_ftp_cmd'] = pd.to_numeric(sample['ct_ftp_cmd'], errors='coerce') # 2. 处理空值(二选一,根据业务需求选择) # 方式A:用0填充空值 sample['ct_ftp_cmd'] = sample['ct_ftp_cmd'].fillna(0) # 方式B:删除含空值的行 # sample = sample.dropna(subset=['ct_ftp_cmd']) # 3. 转为int类型后再转字符串 sample['ct_ftp_cmd'] = sample['ct_ftp_cmd'].astype(int).astype(str)
若确认列中无空值和非数值内容,可简化为:
sample['ct_ftp_cmd'] = sample['ct_ftp_cmd'].astype(int).astype(str)
内容的提问来源于stack exchange,提问作者user12149833
相关产品推荐
相关产品推荐

