【发布时间】:2017-09-30 15:22:28
【问题描述】:
我有一个类似这样的数据框:
df = pd.DataFrame({'col1': ['a', 'a', 'a', 'a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c', 'c'],
'col2': [1, 1, 1, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2],
'col3': [1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0],
'desired': [0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1]})
我想在col3 上应用滚动总和,当col1 或col2 发生变化或col3 的先前值为零时重置。
请注意,计数偏移 1 个单元格。这意味着新的(col1, col2) 组合的期望值将始终为零。
下面的代码演示了所需的逻辑。但是,在下面的数据集上需要将近 4 分钟。
des = []
count = 0
for i in range(1, len(df)):
des.append(count)
if (df.iloc[i-1].col1 == df.iloc[i].col1) & \
(df.iloc[i-1].col2 == df.iloc[i].col2) & \
(df.iloc[i-1].col3 == 1):
count += 1
else:
count = 0
des.append(0)
df['desired'] = des
要测试的更大数据集:https://www.dropbox.com/s/hbafcq6hdkh4r9r/test.csv?dl=0
【问题讨论】:
-
col3第一行为0的情况,能不能加个case,没有图片请难复制。
-
注意:您示例中的最后一个
desired值应为1。这也是我理解的应该基于你的解释。但是您为演示逻辑而提供的代码给出了0。我怀疑您应该在循环后更改为des.append(count)。 -
还不清楚您是想要
col3的累积总和还是累积计数(非零)。对于col3 in {0, 1},两者相同,但其他值呢?问题陈述表明sum,但示例代码表明count。