Python拆分DataFrame:提取每n行及剩余行的方法与报错解决
解决方案:拆分DataFrame为「每n行」与剩余数据,及修复drop报错问题
需求一:生成包含原DataFrame每n行的DataFrame和剩余数据的DataFrame
这里有两种实用方法,你可以根据习惯选择:
方法1:索引提取+删除法
假设原DataFrame为df,要提取每n行(以n=10为例):
import pandas as pd # 示例原DataFrame df = pd.DataFrame({'data': range(100)}) n = 10 # 提取每n行的DataFrame every_n_rows = df.iloc[::n, :] # 删除已选行的索引,得到剩余数据 remaining_rows = df.drop(every_n_rows.index, axis=0)
方法2:布尔掩码筛选法
这种方式逻辑更直观,通过布尔数组标记行的归属:
# 创建掩码:True对应每n行的位置,False对应剩余行 mask = df.index % n == 0 # 提取每n行 every_n_rows = df[mask] # 取掩码反值,得到剩余数据 remaining_rows = df[~mask]
如果需要调整起始行(比如从第2行开始每n行),只需把掩码改成df.index % n == 1即可,灵活性拉满。
需求二:修复drop触发的ValueError问题
你遇到的问题很典型:new.drop([x_test1], axis=0)中,你传入了整个DataFramex_test1,但drop方法需要的是行的索引标签,不是DataFrame对象,所以触发了报错。这里有三种快速修复方案:
方案1:直接传入x_test1的索引
这是最简洁的修改方式,直接替换你原有的drop代码:
dataset = new.drop(x_test1.index, axis=0)
drop会识别这些索引标签并删除对应行。
方案2:布尔索引反选
和需求一的思路呼应,通过掩码排除已选行:
# 标记哪些行属于x_test1 mask = new.index.isin(x_test1.index) # 取反得到剩余行 dataset = new[~mask]
方案3:一步到位提取剩余行
其实你可以在提取x_test1的同时,直接生成剩余数据:
x_test1 = new.iloc[::10, :] # 获取原DataFrame中不在x_test1里的索引 remaining_indices = new.index.difference(x_test1.index) dataset = new.loc[remaining_indices]
内容的提问来源于stack exchange,提问作者Yash Chakarvarty
相关产品推荐
相关产品推荐

