如何在Pandas中正确移除DataFrame首尾各10%的数据?
问题分析与解决方案
你当前代码的核心问题是混淆了基于行位置的首尾截断和基于列值的分位数筛选:你的目标是保留原数据的80%(8行),即移除首尾各10%的行,但现有代码是按列A的数值分位数过滤,两者逻辑完全不同,导致结果不符合预期。
方案1:按行位置移除首尾10%(符合8行预期)
直接计算需要移除的首尾行数,通过切片保留中间部分,严格保证保留80%的行数:
import pandas as pd data = { 'A': [0, 0, 0, 0, 0, 172, 183, 92, 105, 120], 'B': [3, 14, 27, 33, 41, 55, 66, 75, 88, 92] } df = pd.DataFrame(data) # 计算首尾需要移除的行数 total_rows = len(df) remove_count = int(total_rows * 0.1) # 切片保留中间80%的行 filtered_df = df[remove_count : total_rows - remove_count] print(filtered_df)
这段代码会移除第1行和最后1行,保留中间8行,完全符合你的预期。如果遇到总行数不是10的倍数(比如11行),可以用round()调整行数,例如remove_count = round(total_rows * 0.1)。
方案2:按列值分位数筛选(若需基于数值过滤)
如果你的真实需求是保留列A数值在10%到90%分位数区间内的行,需要注意分位数计算和筛选逻辑,但这种方式无法严格保证保留80%的行数(因为可能存在多个行的数值等于分位数)。调整后的代码如下:
import pandas as pd data = { 'A': [0, 0, 0, 0, 0, 172, 183, 92, 105, 120], 'B': [3, 14, 27, 33, 41, 55, 66, 75, 88, 92] } df = pd.DataFrame(data) # 使用nearest插值方法获取最接近分位数的实际数值 q10 = df['A'].quantile(0.1, method='nearest') q90 = df['A'].quantile(0.9, method='nearest') # 筛选包含分位数的行(可根据需求改为>和<) filtered_df = df[(df['A'] >= q10) & (df['A'] <= q90)] print(filtered_df)
此代码会保留所有A值在0到172之间的行(共9行),但这是基于数值分布的结果,而非固定比例的行数。
内容的提问来源于stack exchange,提问作者r ram
相关产品推荐
相关产品推荐

