Pandas DataFrame条件替换Party字段值失败及性能问题求助
问题解决:Pandas条件替换数据
原代码的问题
- 效率极低:嵌套循环遍历
state和year的每个元素,每次循环都对整个party列执行replace操作,重复操作次数过多,时间复杂度为O(n²) - 逻辑错误:
- 当
year != 2010时,continue会跳过后续的year==2015判断,导致BJP的替换逻辑完全未执行 replace('INC','major',inplace=True)是全局替换,会把所有年份的INC都改成major,没有针对2010年的行做筛选- 列名大小写不匹配:原数据集列名是
Party,代码中用df['party']会报错或无法正确定位列
- 当
正确解决方案
使用Pandas的布尔索引矢量化操作,直接针对符合条件的行进行赋值,效率高且逻辑准确:
# 统一列名(匹配原数据集的Party列,避免大小写问题) df.rename(columns={'Party': 'party'}, inplace=True) # 处理第一个需求:2010年的INC替换为major # str.strip()处理原数据中Party列的空格(如"INC "这类带空格的情况) df.loc[(df['year'] == 2010) & (df['party'].str.strip() == 'INC'), 'party'] = 'major' # 处理第二个需求:2015年的BJP替换为major df.loc[(df['year'] == 2015) & (df['party'].str.strip() == 'BJP'), 'party'] = 'major'
代码说明
df.loc[布尔条件, 列名]:Pandas中针对指定行和列赋值的标准方式,矢量化操作无需循环,效率远高于遍历- 两个条件分开处理,逻辑清晰,不会互相干扰
str.strip():处理原数据中Party列存在的前后空格问题,确保匹配准确
处理后的结果
| year | state | district | Party |
|---|---|---|---|
| 2010 | haryana | kaithal | major |
| 2010 | haryana | kaithal | bjp |
| 2010 | haryana | kaithal | NOTA |
| 2010 | goa | panji | AAP |
| 2010 | goa | panji | major |
| 2010 | goa | panji | BJP |
| 2013 | up | meerut | major |
| 2013 | up | meerut | SP |
| 2015 | haryana | kaithal | INC |
| 2015 | haryana | kaithal | major |
| 2015 | haryana | kaithal | AAP |
内容的提问来源于stack exchange,提问作者NoobCoderPy
相关产品推荐
相关产品推荐

