You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas特定行数值符号反转问题及错误代码求助

嗨,我来帮你搞定这个问题!首先咱们先看看你代码出问题的原因,再给你几个高效的解决方案。

问题分析

你的代码没法正常运行,主要有几个关键点:

  1. ix已被弃用:Pandas在新版本里已经移除了ix方法,现在应该用iloc(按位置索引)或者loc(按标签索引)来访问数据。
  2. 索引不匹配:你的DataFrame是以Date(时间戳)作为索引的,但循环里用的r是0、1、2这类位置序号,loc是按标签查找的,所以df.loc[r, 'Betrag']根本找不到对应的行,自然会报错。
  3. 循环效率极低: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'])

处理后的结果示例

运行上面任意一种方法后,你的数据会变成这样:

DateZweckBetrag
2014-09-26 00:00:00Gehalt22.0
2014-09-26 01:00:00REWE-1.0
2014-09-26 02:00:00Edeka-76.0
2014-09-26 03:00:00Bike-51.0
2014-09-26 04:00:00ING-64.0
2014-09-26 05:00:00Allianz-93.0
2014-09-26 06:00:00Bahn-8.0
2014-09-26 07:00:00Kaufhof-33.0
2014-09-26 08:00:00CA-6.0
2014-09-26 09:00:00Shell-55.0

以后处理Pandas数据尽量避免逐行循环,矢量化操作不仅快,还更符合Pandas的设计理念哦!

内容的提问来源于stack exchange,提问作者S.A

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:49:55