Код: Выделить всё
import pandas
import numpy
df = pandas.DataFrame( data= {'s1' :numpy.random.choice( ['A', 'B', 'C', 'D', 'E'], size=20 ),
's2' :numpy.random.choice( ['A', 'B', 'C', 'D', 'E'], size=20 ),
'val':numpy.random.randint(low=-1, high=3, size=20)}, )
Категория («A», «B», «C» и т. д.) может появляться как в s1, так и в s2. При первом появлении категории в s1 или s2 ее значение начинается с нуля, а затем в следующий раз оно появляется в s1 или s2. кажется, что его значение будет суммой предыдущих значений (val)
Пример Dataframe может выглядеть следующим образом:
Код: Выделить всё
s1 s2 val ans1 ans2
0 E B 1 0.0 0.0
1 E C 1 1.0 0.0
2 E A 2 2.0 0.0
3 B A 0 1.0 2.0
4 E B 1 4.0 1.0
5 B C 1 2.0 1.0
Код: Выделить всё
temp={}
df['ans1'] = numpy.nan
df['ans2'] = numpy.nan
for idx, row in df.iterrows():
if row['s1'] in temp:
df.loc[idx,'ans1'] = temp[ row['s1'] ]
temp[ row['s1'] ] = temp[ row['s1'] ] + row['val']
else:
temp[ row['s1'] ] = row['val']
df.loc[idx,'ans1'] = 0
if row['s2'] in temp:
df.loc[idx,'ans2'] = temp[ row['s2'] ]
temp[ row['s2'] ] = temp[ row['s2'] ] + row['val']
else:
temp[ row['s2'] ] = row['val']
df.loc[idx,'ans2'] = 0
Что я не могу сделать, так это найти решение этой проблемы без перебора каждой строки кадра данных.
Я не могу решить проблему только в случае с s1 - где я могу использовать .groupby().cumsum().shift(1) и получить правильные значения в правильных строках, но не могу найти решение, в котором есть два набора s1 и s2 (или больше, поскольку мне нужно отслеживать несколько датчиков), поэтому я надеюсь, что есть общее, более векторизованное решение, которое будет работать?
Подробнее здесь: https://stackoverflow.com/questions/789 ... erent-colu