如何按性别拆分DataFrame为两个独立的数据框?
按性别拆分DataFrame的解决方案
最优方法:布尔索引(推荐)
直接利用pandas的布尔索引过滤行,这是最简洁高效的方式:
# 提取所有性别为Male的行,生成新DataFrame a2 = a1[a1['Gender'] == 'Male'] # 提取所有性别为Female的行,生成新DataFrame a3 = a1[a1['Gender'] == 'Female']
这种方法不需要循环,完全利用pandas的向量化操作,性能远优于循环,且代码易读。
循环方式(不推荐,但解决你的问题)
如果一定要用循环实现,需要先初始化空DataFrame,每次将单行数据转为DataFrame后用concat添加(避免覆盖或报错):
import pandas as pd # 初始化与原DataFrame列名一致的空数据框 a2 = pd.DataFrame(columns=a1.columns) a3 = pd.DataFrame(columns=a1.columns) # 遍历原DataFrame的每一行 for _, row in a1.iterrows(): if row['Gender'] == 'Male': # 将单行Series转为DataFrame(转置后是单行),再合并 a2 = pd.concat([a2, row.to_frame().T], ignore_index=True) else: a3 = pd.concat([a3, row.to_frame().T], ignore_index=True)
你之前代码的问题分析
- 第一个代码报错原因:
a1.iloc[i]返回的是Series对象,而merge()是DataFrame的方法,Series没有这个属性,所以报错。merge用于合并两个结构匹配的DataFrame,不是用来逐行添加数据的。 - 第二个代码覆盖数据原因:每次循环都直接把
a2/a3赋值为当前行的Series,之前存储的数据会被覆盖,最终只保留最后一行符合条件的数据。 - concat无效的可能原因:你可能直接拼接了Series,而没有先将其转为单行DataFrame,导致结构不匹配。
内容的提问来源于stack exchange,提问作者akhilesh mudliar
相关产品推荐
相关产品推荐

