Pandas特定行数值符号反转问题及错误代码求助
嗨,我来帮你搞定这个问题!首先咱们先看看你代码出问题的原因,再给你几个高效的解决方案。
问题分析
你的代码没法正常运行,主要有几个关键点:
ix已被弃用:Pandas在新版本里已经移除了ix方法,现在应该用iloc(按位置索引)或者loc(按标签索引)来访问数据。- 索引不匹配:你的DataFrame是以
Date(时间戳)作为索引的,但循环里用的r是0、1、2这类位置序号,loc是按标签查找的,所以df.loc[r, 'Betrag']根本找不到对应的行,自然会报错。 - 循环效率极低:Pandas是为矢量化运算设计的,逐行循环处理数据不仅慢,还容易出错,完全没必要这么做。
高效解决方案
下面给你几个简洁又高效的方法,都是Pandas推荐的矢量化操作:
方法一:直接用loc条件赋值(最推荐)
一行代码就能搞定,直接筛选出Zweck不等于Gehalt的行,然后把对应的Betrag乘以-1:
df.loc[df['Zweck'] != 'Gehalt', 'Betrag'] *= -1
方法二:用numpy.where做条件替换
如果需要更清晰的条件逻辑,可以用np.where,它会根据条件返回对应的值:
import numpy as np df['Betrag'] = np.where(df['Zweck'] != 'Gehalt', -df['Betrag'], df['Betrag'])
解释:满足Zweck != 'Gehalt'的行,Betrag取负值;不满足的(也就是Gehalt)保持原数值。
方法三:用mask方法替换
mask方法可以把满足条件的位置替换成指定值,用法也很直观:
df['Betrag'] = df['Betrag'].mask(df['Zweck'] != 'Gehalt', -df['Betrag'])
处理后的结果示例
运行上面任意一种方法后,你的数据会变成这样:
| Date | Zweck | Betrag |
|---|---|---|
| 2014-09-26 00:00:00 | Gehalt | 22.0 |
| 2014-09-26 01:00:00 | REWE | -1.0 |
| 2014-09-26 02:00:00 | Edeka | -76.0 |
| 2014-09-26 03:00:00 | Bike | -51.0 |
| 2014-09-26 04:00:00 | ING | -64.0 |
| 2014-09-26 05:00:00 | Allianz | -93.0 |
| 2014-09-26 06:00:00 | Bahn | -8.0 |
| 2014-09-26 07:00:00 | Kaufhof | -33.0 |
| 2014-09-26 08:00:00 | CA | -6.0 |
| 2014-09-26 09:00:00 | Shell | -55.0 |
以后处理Pandas数据尽量避免逐行循环,矢量化操作不仅快,还更符合Pandas的设计理念哦!
内容的提问来源于stack exchange,提问作者S.A
相关产品推荐
相关产品推荐

