Как сравнивать столбцы и возвращать значения рекурсивно? - PullRequest
0 голосов
/ 07 апреля 2020

У меня есть фрейм данных, который выглядит следующим образом:

data_dict = {'factor_1' : np.random.randint(1, 5, 10), 'factor_2' : np.random.randint(1, 5, 10), 'multi' : np.random.rand(10), 'output' : np.NaN}
df = pd.DataFrame(data_dict)

Я застреваю при реализации этого сравнения:

  1. Если factor_1 и factor_2 значения совпадают, тогда output = 2 * multi (Здесь 2 - базовое значение). Продолжите сканирование следующих строк.

  2. Если значения factor_1 и factor_2 не совпадают, то:

    • output = -2. Сканирование следующей строки.
    • Если значения факторов по-прежнему не совпадают до строки R, тогда присвойте значения для output как $ -2 ^ 2, -2 ^ 3, ..., -2 ^ R $ соответственно.
    • Когда значения коэффициентов совпадают в строке R+1, тогда присвойте значение для output как $ 2 ^ (R + 1) * multi $.
    • Повторите процесс

Конечный результат будет выглядеть следующим образом:

enter image description here

Ответы [ 3 ]

1 голос
/ 07 апреля 2020

Решение, которое я представляю, может быть, немного сложнее для чтения, но я думаю, что оно работает так, как вы хотели. Он объединяет

  • numpy.where(), чтобы создать столбец на основе условия,
  • pandas.DataFrame.shift() и pandas.DataFrame.cumsum() для обозначения различных групп последовательными похожими значениями и
  • pandas.DataFrame.rank() для построения вектора степеней, использованного в ранее сделанном столбце df['output'].

Код следующий.

df['output'] = np.where(df.factor_1 == df.factor_2, -2 * df.multi, 2)
group = ['output', (df.output != df.output.shift()).cumsum()]
df['output'] = (-1) * df.output.pow(df.groupby(group).output.rank('first'))
1 голос
/ 07 апреля 2020

Это решение не использует рекурсию:

# sample data
np.random.seed(1)
data_dict = {'factor_1' : np.random.randint(1, 5, 10), 'factor_2' : np.random.randint(1, 5, 10), 'multi' : np.random.rand(10), 'output' : np.NaN}
df = pd.DataFrame(data_dict)

# create a mask
mask = (df['factor_1'] != df['factor_2'])
# get the cumsum from the mask
df['R'] = mask.cumsum() - mask.cumsum().where(~mask).ffill().fillna(0)

# use np.where to create the output
df['output'] = np.where(df['R'] == 0, df['multi']*2, -2**df['R'])

   factor_1  factor_2     multi     output    R
0         2         1  0.419195  -2.000000  1.0
1         4         2  0.685220  -4.000000  2.0
2         1         1  0.204452   0.408904  0.0
3         1         4  0.878117  -2.000000  1.0
4         4         2  0.027388  -4.000000  2.0
5         2         1  0.670468  -8.000000  3.0
6         4         3  0.417305 -16.000000  4.0
7         2         2  0.558690   1.117380  0.0
8         4         3  0.140387  -2.000000  1.0
9         1         1  0.198101   0.396203  0.0
1 голос
/ 07 апреля 2020
flag = False
cols = ('factor_1', 'factor_2', 'multi')
z = zip(*[data_dict[col] for col in cols])
for i, (f1, f2, multi) in enumerate(z):
    if f1==f2: 
        output = 2 * multi
        flag = False
    else:
        if flag:
            output *= 2
        else:
            output = -2
            flag = True
    data_dict['output'][i] = output

Хитрая часть - это переменная flag, которая сообщает вам, совпадал ли предыдущий ряд или нет.

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