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

Pandas行值变化统计问题:为何dsf列全部为0?

问题根源

为啥你的dsf全是0?核心问题在于**iterrows()返回的r是原DataFrame行的副本,不是引用**。你在循环里修改r['dsf'],只是改了这个临时副本的值,根本没碰着full_data本身的数据,所以最后full_data里的dsf还是你初始设置的0。

修正方法

方法1:直接修改原DataFrame(兼容你的原有逻辑)

把循环里对r['dsf']的修改,换成用loc通过行索引定位原DataFrame的行来修改,这样改动才会生效:

full_data['dsf'] = 0
counter = 0
for i, r in full_data.iterrows():
    if r['neg'] == 0:
        counter += 1
        # 这里初始值已经是0,可省略
        # full_data.loc[i, 'dsf'] = 0
    else:
        full_data.loc[i, 'dsf'] = counter
        counter = 0

方法2:更高效的向量化实现(推荐)

iterrows()在处理大数据集时速度很慢,用pandas的向量化操作能更简洁高效地完成需求:

# 按neg=1的位置划分分组,每遇到一个neg=1就开启新组
full_data['group'] = (full_data['neg'] == 1).cumsum()
# 对每个组内的行从1开始计数
full_data['dsf'] = full_data.groupby('group').cumcount() + 1
# 只保留neg=1的行的计数,neg=0的行设为0
full_data['dsf'] = full_data['dsf'].where(full_data['neg'] == 1, 0)
# 删掉临时的group列(可选)
full_data = full_data.drop('group', axis=1)

举个实际效果的例子:
假设原始数据的neg列是:[0, 0, 1, 0, 1]
处理后dsf列会是:[0, 0, 2, 0, 1]
正好对应你要的:从连续的0到第一次出现1时,统计前面0的数量(第一个1前面有2个0,所以dsf=2;第二个1前面有1个0,所以dsf=1)。

内容的提问来源于stack exchange,提问作者Deepak

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:58:51