Условный оператор между столбцами и строками в фрейме данных - PullRequest
0 голосов
/ 14 февраля 2019

Я хотел бы создать в столбце, который создает значение на основе оператора if между значениями в той же строке и, если необходимо, в строках выше.У меня есть константа A и df

A = 0.5
          FID_1          b          c        d            e
75907       nan 33021647.00   27014.12 27014.12        1.00
75858 159510.00 32888862.00   16532.64 28797.05        0.57
75859 159510.00 32888862.00   12264.41 28797.05        0.43
75795       nan 32869718.00   24218.16 24218.16        1.00
75518       nan 32574894.00   13304.45 13304.45        1.00

Я хотел бы создать еще один столбец с именем f, который будет сообщать мне, если значение в e больше, чем A или нет для данногозначение в b.Если это правильно, то значение равно 1.

Пример для вышеупомянутого df:

          FID_1          b          c        d            e    f
75907       nan 33021647.00   27014.12 27014.12        1.00    1
75858 159510.00 32888862.00   16532.64 28797.05        0.57    1
75859 159510.00 32888862.00   12264.41 28797.05        0.43    0
75795       nan 32869718.00   24218.16 24218.16        1.00    1
75518       nan 32574894.00   13304.45 13304.45        1.00    1

Что будет сложнее, если я изменю значение A на 0.6.В этом случае я хотел бы видеть для каждого числа в b, если первая строка значения в b имеет значение в e больше, чем A, и если нет, я бы хотелсм. для второй строки того же значения sum значений в e и проверьте, больше ли оно, чем A. df с A=0.6 выглядит следующим образом:

          FID_1          b          c        d            e    f
75907       nan 33021647.00   27014.12 27014.12        1.00    1
75858 159510.00 32888862.00   16532.64 28797.05        0.57    0
75859 159510.00 32888862.00   12264.41 28797.05        0.43    1
75795       nan 32869718.00   24218.16 24218.16        1.00    1
75518       nan 32574894.00   13304.45 13304.45        1.00    1

Inв этом случае код суммирует 0,57 и 0,43 в третьей строке df.

Если это не так, код будет искать третью, четвертую, ... строку того же значения вb - если он вообще существует.

Это код для создания e столбца

df['e'] = df.apply(lambda row: row.c / row.d, axis=1)

Я пробовал подобное для столбца f, но я не знаюкак ввести if statement в тот же код.

Это начало моего решения:

def STAcondition (row):
   if row['e'] > A :
      return 0
   if row['e'] < A :
      return 1
   return 'Other'

df['f'] =  df.apply (lambda row: STAcondition (row),axis=1)

1 Ответ

0 голосов
/ 14 февраля 2019

Может быть, попытаться создать f в несколько шагов.Если я правильно понимаю, ваш псевдоалгоритм должен выглядеть следующим образом:

  • Входное значение для поиска в b
  • Значение в 'e' больше, чем A?
    • Если true, значение в f = 1
    • Если false, определить, имеет ли значение для поиска дубликаты в b.Получить их индексы.
      • В строке последнего вхождения искомого значения в столбце f суммируйте значения дубликатов.
      • Является ли сумма больше A?
        • Если true, значение в f = 1
        • Если false, значение в f = 0

Вот что я нарисовал:

import pandas as pd
import numpy.random as npr
import numpy as np

# Dummy data
dfInit = {
    'FID_1':npr.randint(0,10,10),
    'b':npr.randint(0,10,10),
    'c':npr.randint(0,10,10),
    'd':npr.randint(0,10,10),
    'e':npr.randint(0,10,10)
}
dfIndex = np.arange(0,10)
df = pd.DataFrame(data=dfInit, index=dfIndex)

# Algo
df['f'] = np.zeros(10)
A = 6

def letsMakeAnF(value):
    # check if value is in b
    if value in df['b'].unique():
        occurrenceMatch = df.loc[df['b'] == value,:] 
    else:
        print('value not in b series')
        return

    if occurrenceMatch['e'].iloc[0] > A:
        df['f'].ix[occurrenceMatch.index[0]] == 1
    else:
        if np.sum(occurrenceMatch['b']) > A:
            df['f'].ix[occurrenceMatch.index[-1]] = 1

#Generate random 'wanted' values
values = [npr.randint(0, 10) for x in range(10)]

#Iterate over the values and modify the DF. Note that in this case
#df is a global variable
for value in values:
   letsMakeAnF(value)

Надеюсь, это поможет!

...