Pandas不同行数数据写入CSV仅保留最小行数问题求助
问题根源
- 你当前的代码逻辑是逐列删除整个DataFrame的行:处理第一列时删掉了超出99分位数的对应行,整个DataFrame的行数直接减少,后续处理第二列是在已经缩减后的DataFrame基础上再删行,最终全表行数就是所有列删行后最小的交集行数,自然所有列都会被截断。
- 你将
to_csv放在了for循环内部,每次循环都会覆盖之前写入的CSV文件,最终输出的只是最后一列处理完的结果,完全没有保留之前列的处理结果。 - ffill/bfill是用来填充已有行中的空值,你已经把多余的行全部删除,自然无法生效。
解决方案
根据你的需求有两种实现方式:
方式1:保留原始全表行数,仅将各列异常值设为空
如果需要保留原始行的对应关系,只是把异常值清空,不删除行,用以下代码:
import pandas as pd features = ['HYG_FT01', 'HYG_PU12_PW_PV'] df = pd.read_csv('HYG_2021_08.csv', usecols=features, sep=';', encoding='ISO-8859-1') for col in features: q99 = df[col].quantile(q=0.99, numeric_only=True) # 仅标记当前列的异常值为空,不删除整行 df.loc[df[col] > q99, col] = pd.NA print(df[col].describe()) # 所有列处理完成后统一写入CSV,空值会自动留空,不会截断任何列的有效值 df.to_csv('trials.csv', index=False)
方式2:各列单独剔除异常值后按最长列对齐,不足的位置补空
如果不需要保留原始行的对应关系,只需要把每列的有效值全部保存,长度不足的列尾部补空,用以下代码:
import pandas as pd features = ['HYG_FT01', 'HYG_PU12_PW_PV'] df = pd.read_csv('HYG_2021_08.csv', usecols=features, sep=';', encoding='ISO-8859-1') col_res = {} for col in features: q99 = df[col].quantile(q=0.99, numeric_only=True) # 提取当前列所有有效值,重置索引避免自动行对齐 valid_series = df.loc[df[col] <= q99, col].reset_index(drop=True) col_res[col] = valid_series # 按最长列的长度对齐,短列尾部自动补空 final_df = pd.DataFrame(col_res) final_df.to_csv('trials.csv', index=False)
内容的提问来源于stack exchange,提问作者bazinga
相关产品推荐
相关产品推荐

