Фрейм данных кумулятивной суммы панд с условиями - PullRequest
0 голосов
/ 24 мая 2019

Я хотел бы, чтобы кумулятивная сумма с некоторыми условиями, регулярная кумулятивная сумма дается столбцом b, однако я хотел бы, чтобы результат кумулятивной суммы в столбце d, который делает нормальную сумму, не: Во-первых, обычная операция кумулятивногосумма, когда результат суммы находится в пределах (заданных 0.2 и 0.4).Однако, когда столбец d превысил нижнюю границу (0.2) или верхнюю границу (0.4), я бы хотел добавить конкретное значение, когда столбец a равен нулю (соответственно 0.1 и -0.1).Желаемые дополнения и вычитания приведены в столбце c.Строки 4 и 7 - это модифицированные строки, остальные строки - это регулярные операции с суммированием.

Ответы [ 2 ]

0 голосов
/ 24 мая 2019

Вы можете решить эту проблему пошагово (не уверен, что это будет быстрее, чем подход Сержа .

У нас есть ваш столбец df['a'] и начнем с создания столбца df['b'] какcumsum и столбец df['c'] как копия df['a'] (этого можно избежать, если вы не возражаете против изменения значений на df['a'].

       a     b      c     
  1  0.1    0.1    0.1  
  2  0.2    0.3    0.2   
  3  -0.11  0.19   -0.11  
  4  0.0    0.19   0.0  
  5  -0.07  0.12   -0.07   
  6  0.2    0.32   0.2   
  7  0.0    0.32   0.0 

Теперь мы можем изменять значения в df['c'] в соответствии с необходимыми условиями:

df.loc[(df['a']==0) & (df['b']<0.2),'c']=0.1
df.loc[(df['a']==0) & (df['b']>0.4),'c']=-0.1

и, наконец, принять сумму df['c']

df['c'].cumsum()

Out[]: 
1    0.10
2    0.30
3    0.19
4    0.29
5    0.22
6    0.42
7    0.42
0 голосов
/ 24 мая 2019

Проблема в том, что добавляемое значение на самом деле зависит от текущей суммы.ИМХО, это будет трудно выразить с помощью истинного выражения панд, поэтому я бы просто попытался перебрать базовые массивы:

a = df['a'].values
d = np.zeros(len(a))
old = 0.
nv = 0.1
for i in range(len(a)):
    if a[i] != 0. or (.2 < old < .4):
        d[i] = old + a[i]
    else:
        d[i] = old + nv
        nv = -nv
    old = d[i]

df['d'] = d

Это дает ожидаемый результат:

      a     d
0  0.10  0.10
1  0.20  0.30
2 -0.11  0.19
3  0.00  0.29
4 -0.07  0.22
5  0.20  0.42
6  0.00  0.32

Не такэффективен как настоящая векторизованная операция, но все же гораздо эффективнее, чем iterrows

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...