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
相关产品推荐
相关产品推荐

