Панды генерируют столбцы совокупных сумм на основе имен переменных в двух разных столбцахPython

Программы на Python
Anonymous
Панды генерируют столбцы совокупных сумм на основе имен переменных в двух разных столбцах

Сообщение Anonymous »

У меня есть следующий фрейм данных:

Код: Выделить всё

    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)},   )
Я хочу создать два столбца результатов, которые предоставляют совокупную сумму значения (val) на основе категорий в «s1» и/или «s2».
Категория («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
Я могу сгенерировать правильные столбцы ответов (ans1 и ans2 — соответствующие столбцам set1 и set2) следующим образом:

Код: Выделить всё

    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
используя 'temp' в качестве словаря для хранения промежуточных итогов каждой категории (A-E), я могу получить два столбца ответов...
Что я не могу сделать, так это найти решение этой проблемы без перебора каждой строки кадра данных.
Я не могу решить проблему только в случае с s1 - где я могу использовать .groupby().cumsum().shift(1) и получить правильные значения в правильных строках, но не могу найти решение, в котором есть два набора s1 и s2 (или больше, поскольку мне нужно отслеживать несколько датчиков), поэтому я надеюсь, что есть общее, более векторизованное решение, которое будет работать?

Подробнее здесь: https://stackoverflow.com/questions/789 ... erent-colu

Вернуться в «Python»