У меня есть столбец, который выглядит примерно так:
1 0 0 1 0 0 0 1
Я хочу, чтобы вывод выглядел примерно так:
1 <-- 0 0 2 <-- 0 0 0 3 <--
И так далее. Я не уверен, с чего начать. Там около 10000 строк, и я чувствую, что создание оператора if может занять некоторое время. Как мне добиться этого результата?
Эффективно и кратко:
s.cumsum()*s
0 1 1 0 2 0 3 2 4 0 5 0 6 0 7 3 dtype: int64
Использование Series.cumsum + Series.where
Вот пример:
print(df) 0 0 1 1 0 2 0 3 1 4 0 5 0 6 0 7 1 df['0']=df['0'].cumsum().where(df['0'].ne(0),df['0']) print(df) 0 0 1 1 0 2 0 3 2 4 0 5 0 6 0 7 3
Попробуйте это:
s = pd.Series([1,0,0,1,0,0,0,1]) s.cumsum().mask(s==0, 0)
Вывод:
Выберите только те строки, которые не равны нулю, и замените эти значения на cumsum
import pandas as pd df=pd.DataFrame({'col': [0,1,0,0,1,0,0,0,1,0] }) index=df["col"]!=0 df.loc[index,"col"]=df.loc[index,"col"].cumsum() print(df) col 0 0 1 1 2 0 3 0 4 2 5 0 6 0 7 0 8 3 9 0
вы можете сделать что-то вроде этого
df = {'col1': [1, 0,0,0,1,0,0,1] } count = 0 col = [] for val in zip(df['col1']): if val[0] == 1: count+=1 col.append(count) else: col.append(val[0])
и вы получите [1, 0, 0, 0, 2, 0, 0, 3]
[1, 0, 0, 0, 2, 0, 0, 3]
np.where и cumsum:
np.where
cumsum
df['cum_sum'] = np.where(df.val>0, df.val.cumsum(), 0)
вывод:
val cum_sum 0 1 1 1 0 0 2 0 0 3 1 2 4 0 0 5 0 0 6 0 0 7 1 3