Работа колонки обусловлена ​​предыдущим рядом - PullRequest
0 голосов
/ 22 мая 2018

Я предполагаю, что подобные вопросы существуют, но не смогли их найти.У меня установлена ​​Pandas 0.19.2.У меня большой массив данных, и для каждого значения строки я хочу перенести значение предыдущей строки для одного и того же столбца на основе некоторого логического условия.

Ниже приведено решение для перебора с двойным циклом грубой силы для небольшого примера.,Каков наиболее эффективный способ реализовать это?Можно ли решить это в векторизации?

import pandas as pd
import numpy as np

np.random.seed(10)
df = pd.DataFrame(np.random.uniform(low=-0.2, high=0.2, size=(10,2) ))
print(df)

for col in df.columns:
    prev = None
    for i,r in df.iterrows():
        if prev is not None:
            if (df[col].loc[i]<= prev*1.5) and (df[col].loc[i]>= prev*0.5):
                df[col].loc[i] = prev

        prev = df[col].loc[i]
print(df)

Вывод:

          0         1
0  0.108528 -0.191699
1  0.053459  0.099522
2 -0.000597 -0.110081
3 -0.120775  0.104212
4 -0.132356 -0.164664
5  0.074144  0.181357
6 -0.198421  0.004877
7  0.125048  0.045010
8  0.125048 -0.083250
9  0.125048  0.085830

РЕДАКТИРОВАТЬ: Обратите внимание, что одно значение может переноситься несколько раз,до тех пор, пока оно удовлетворяет логическому условию.

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

Я придумал это:

keep_going = True
while keep_going:
    df = df.mask((df.diff(1) / df.shift(1)<0.5) & (df.diff(1) / df.shift(1)> -0.5) & (df.diff(1) / df.shift(1)!= 0)).ffill()
    trimming_to_do = ((df.diff(1) / df.shift(1)<0.5) & (df.diff(1) / df.shift(1)> -0.5) & (df.diff(1) / df.shift(1)!= 0)).values.any()
    if not trimming_to_do:
        keep_going= False

, который дает желаемый результат (по крайней мере, для этого случая):

print(df)
          0         1
0  0.108528 -0.191699
1  0.053459  0.099522
2 -0.000597 -0.110081
3 -0.120775  0.104212
4 -0.120775 -0.164664
5  0.074144  0.181357
6 -0.198421  0.004877
7  0.125048  0.045010
8  0.125048 -0.083250
9  0.125048  0.085830
0 голосов
/ 22 мая 2018
prev = df.shift()
replace_mask = (0.5 * prev <= df) & (df <= 1.5 * prev)
df = df.where(~replace_mask, prev)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...