如何删除Pandas DataFrame中含NoneType与字符串的行,仅保留数值型数据?
解决方法:保留数值型数据并过滤无效行
首先得指出你代码里的核心问题:df_3.to_csv('Documents/a.csv',index=False)这个方法的作用是把DataFrame写入到CSV文件中,它返回的是None,而不是新的DataFrame。所以你把它赋值给df5之后,df5就是一个NoneType对象,自然调用不了['rt']或者dropna()这些方法,这就是你报错的原因。
下面给你两种可行的解决方案,根据你的需求选择:
方案一:直接在原DataFrame上清洗(推荐)
不需要先存成CSV再处理,直接对提取后的df_3进行清洗,最后再保存即可:
import pandas as pd # 提取需要的列 df_3 = df_cor_inc[['Person ID','rt']] # 将rt列转换为数值类型,非数值内容会被转为NaN df_3['rt'] = pd.to_numeric(df_3['rt'], errors='coerce') # 删除rt列为NaN的行(包括空值和非数值字符串) df_cleaned = df_3.dropna(subset=['rt']) # 保存清洗后的结果到CSV df_cleaned.to_csv('Documents/a.csv', index=False)
这个方法的好处是效率更高,不需要额外的读写文件操作,而且pd.to_numeric能识别整数、浮点数格式的字符串,适用性更广。
方案二:先保存再读取处理(如果你确实需要先存文件)
如果你一定要先把数据存成CSV再处理,那必须用pd.read_csv把文件读回来,得到有效的DataFrame后再操作:
import pandas as pd # 提取列并保存到CSV df_3 = df_cor_inc[['Person ID','rt']] df_3.to_csv('Documents/a.csv', index=False) # 读取CSV文件得到DataFrame df5 = pd.read_csv('Documents/a.csv') # 转换rt列并过滤无效行 df5['rt'] = pd.to_numeric(df5['rt'], errors='coerce') df_cleaned = df5.dropna(subset=['rt'])
补充:用isnumeric()过滤的注意事项
如果你想用str.isnumeric()的方式过滤,要注意这个方法只对整数格式的字符串有效(比如'1230'会返回True,但'123.45'或者空字符串''会返回False),而且要先排除空值,否则会报错:
df_3 = df_cor_inc[['Person ID','rt']] # 先排除空值,再判断是否为数字字符串 df_cleaned = df_3[df_3['rt'].notna() & df_3['rt'].astype(str).str.isnumeric()]
这种方法适合你确定rt列只有整数的场景,否则还是方案一更稳妥。
内容的提问来源于stack exchange,提问作者dazai
相关产品推荐
相关产品推荐

