如何基于另一dataframe的取值将pandas dataframe拆分为6个新dataframe
实现方案
首先对齐两个DataFrame的行顺序,避免因索引不匹配导致分类错误:
import pandas as pd # 截取trainX前7351行与trainY长度对齐,重置索引保证行严格对应 trainX_align = trainX.iloc[:len(trainY)].reset_index(drop=True) trainY_align = trainY.reset_index(drop=True) # 合并标签列到特征表中,方便后续筛选 train_merged = pd.concat( [trainX_align, trainY_align.rename(columns={trainY.columns[0]: "label"})], axis=1 )
方式1:直接生成6个独立DataFrame
直接得到你需要的class1到class6六个结果表,每个表仅保留对应标签的trainX原始特征列:
class1 = train_merged[train_merged["label"] == 1].drop("label", axis=1).reset_index(drop=True) class2 = train_merged[train_merged["label"] == 2].drop("label", axis=1).reset_index(drop=True) class3 = train_merged[train_merged["label"] == 3].drop("label", axis=1).reset_index(drop=True) class4 = train_merged[train_merged["label"] == 4].drop("label", axis=1).reset_index(drop=True) class5 = train_merged[train_merged["label"] == 5].drop("label", axis=1).reset_index(drop=True) class6 = train_merged[train_merged["label"] == 6].drop("label", axis=1).reset_index(drop=True)
方式2:存入字典(更适合批量操作)
不需要定义6个独立变量,后续通过class_dfs[标签值]即可调用对应类别的数据:
class_dfs = {} for label in range(1, 7): class_dfs[label] = train_merged[train_merged["label"] == label].drop("label", axis=1).reset_index(drop=True)
不推荐使用
iterrows()遍历实现:该方法遍历效率极低,且容易出现索引错位的问题。上述方案使用pandas向量化布尔索引实现,运行效率更高,也不会出现语法错误。
如果你确认trainX和trainY的行已经严格按顺序对应,也可以跳过合并步骤,直接通过trainX.iloc[:len(trainY)][trainY.iloc[:,0]==标签值]筛选对应的行。
内容的提问来源于stack exchange,提问作者Mario Boot
相关产品推荐
相关产品推荐

