Как сравнить значения в 2 столбцах и выполнить присвоение в новом столбце? - PullRequest
0 голосов
/ 13 июля 2020

У меня есть df с именем data следующим образом:

    id  upper_ci    lower_ci    max_power_contractual
0   12858 60.19878860406808 49.827481214215204  0
1   12858 60.61189293066522 49.298784196530896  0
2   12858 60.34397624424309 49.718421137642885  70
3   12858 59.87472261936114 49.464255779713476  10
4   12858 60.2735279368527  49.41672240525131   0

Я пытаюсь создать новый столбец с именем up_threshold следующим образом:

  • Если значение max_power_contractual равно нулю (0) или NaN, тогда значение в up_threshold должно быть значением в upper_ci
  • Если значение max_power_contractual равно не ноль, и условие: max_power_contractual > upper_ci равно True, тогда значение в up_threshold должно быть значением в upper_ci
  • Если значение max_power_contractual < upper_ci равно True, тогда значение в up_threshold должно быть значением в max_power_contractual

Я пробовал:

if (data['max_power_contractual'] in (0, np.nan)) or (data['max_power_contractual'] > data['upper_ci']):
    data['up_threshold'] = data['upper_ci']
elif (data['upper_ci'] > data['max_power_contractual'] == 0):
    data['up_threshold'] = data['max_power_contractual']

Но это дает мне следующую ошибку:

Traceback (последний вызов последний):

Файл "/home/cortex/.config/spyder-py3/temp.py", строка 179, в data = cp_detection (data, threshold)

Файл "/home/cortex/.config/spyder-py3/temp.py", строка 146, в cp_detection if data ['max_power_contractual'] == 0:

Файл "/ home / cortex / .local / lib / python3 .7 / site-packages / pandas / core / generi c .py », строка 1479 , in ненулевое значение f "Истинное значение {type (self). name } неоднозначно. "

ValueError: Истинное значение Серии неоднозначно. Используйте a.empty, a.bool (), a.item (), a.any () или a.all ().

Кто-нибудь, пожалуйста, скажите мне мою ошибку и как я могу ее исправить?

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

    id  upper_ci    lower_ci    max_power_contractual   up_threshold
0   12858 60.19878860406808 49.827481214215204  0   60.19878860406808 (Since `max_power_contractual` value is 0)
1   12858 60.61189293066522 49.298784196530896  NaN  60.61189293066522 (Since `max_power_contractual` value is NaN)
2   12858 60.34397624424309 49.718421137642885  70   60.34397624424309 (Since `upper_ci < max_power_contractual`)
3   12858 59.87472261936114 49.464255779713476  10  10 (Since `upper_ci > max_power_contractual`)

Ответы [ 3 ]

2 голосов
/ 13 июля 2020

Вы можете использовать np.where, чтобы добавить новый столбец:

df['up_threshold'] = np.where(df['max_power_contractual'].fillna(0) == 0, df['upper_ci'],
    np.where(df['max_power_contractual'] > df['upper_ci'], df['upper_ci'], df['max_power_contractual'])
)

print(df)

Печать:

      id   upper_ci   lower_ci  max_power_contractual  up_threshold
0  12858  60.198789  49.827481                    0.0     60.198789
1  12858  60.611893  49.298784                    NaN     60.611893
2  12858  60.343976  49.718421                   70.0     60.343976
3  12858  59.874723  49.464256                   10.0     10.000000
4  12858  60.273528  49.416722                    0.0     60.273528
1 голос
/ 13 июля 2020

Используйте np.select

import numpy as np

m1 = df.max_power_contractual.isin([np.NaN, 0])
m2 = df.max_power_contractual > df.upper_ci

df['up_threshold'] = np.select([m1, m2], [df.upper_ci, df.upper_ci], default=df.max_power_contractual)
print(df)

Вывод

      id   upper_ci   lower_ci  max_power_contractual  up_threshold
0  12858  60.198789  49.827481                      0     60.198789
1  12858  60.611893  49.298784                      0     60.611893
2  12858  60.343976  49.718421                     70     60.343976
3  12858  59.874723  49.464256                     10     10.000000
4  12858  60.273528  49.416722                      0     60.273528

Поскольку мы используем те же столбцы в качестве вариантов выбора, мы также можем использовать

df['up_threshold'] = np.where((m1 | m2), df.upper_ci, df.max_power_contractual)
0 голосов
/ 13 июля 2020

Неэффективный способ, но его легче понять

In [17]: def process(data):
    ...:     result = None
    ...:     if (data['max_power_contractual'] in (0, np.nan)) or (data['max_power_contractual'] > data['upper_ci']):
    ...:        result = data['upper_ci']
    ...:     elif (data['upper_ci'] > data['max_power_contractual']):
    ...:        result = data['max_power_contractual']
    ...:
    ...:     return result
    ...:

In [18]: df.apply(process, axis=1)
Out[18]:
0    60.198789
1    60.611893
2    60.343976
3    10.000000
4    60.273528
dtype: float64

In [19]: df["up_threshold"] = df.apply(process, axis=1)

In [20]: df
Out[20]:
      id   upper_ci   lower_ci  max_power_contractual  up_threshold
0  12858  60.198789  49.827481                      0     60.198789
1  12858  60.611893  49.298784                      0     60.611893
2  12858  60.343976  49.718421                     70     60.343976
3  12858  59.874723  49.464256                     10     10.000000
4  12858  60.273528  49.416722                      0     60.273528
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...