Условное создание столбца Dataframe, где вычисление значений столбца изменяется на основе ввода строки - PullRequest
2 голосов
/ 27 июня 2019

У меня очень длинный и широкий массив данных. Я хотел бы создать новый столбец в этом кадре данных, где значение зависит от многих других столбцов в df. Расчет, необходимый для значений в этом новом столбце, ТАКЖЕ изменяется, в зависимости от значения в каком-либо другом столбце.

Ответы на на этот вопрос и на этот вопрос подходят близко, но мне это не совсем подходит.

В итоге у меня будет около 30 различных вычислений, которые можно применить, поэтому я не слишком заинтересован в функции np.where, которая не слишком читаема для слишком большого числа условий.

Мне также настоятельно рекомендовали не делать цикл for для всех строк в кадре данных, поскольку он должен быть ужасным для производительности (пожалуйста, исправьте меня, если я ошибаюсь).

Что я пытался сделать вместо этого:

import pandas as pd
import numpy as np

# Information in my columns look something like this:
df['text'] = ['dab', 'def', 'bla', 'zdag', 'etc']
df['values1'] = [3 , 4, 2, 5, 2]
df['values2'] = [6, 3, 21, 44, 22]
df['values3'] = [103, 444, 33, 425, 200]

# lists to check against to decide upon which calculation is required
someList = ['dab', 'bla']
someOtherList = ['def', 'zdag']
someThirdList = ['etc']

conditions = [
    (df['text'] is None),
    (df['text'] in someList),
    (df['text'] in someOtherList),
    (df['text'] in someThirdList)]
choices = [0, 
           round(df['values2'] * 0.5 * df['values3'], 2), 
           df['values1'] + df['values2'] - df['values3'], 
           df['values1'] + 249]
df['mynewvalue'] = np.select(conditions, choices, default=0)
print(df)

Я ожидаю, что на основе значений строк в df['text'] правильный расчет применяется к тому же значению строки df['mynewvalue'].

Вместо этого я получаю ошибку The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

Как я могу запрограммировать это, чтобы я мог использовать такие условия для определения правильного расчета для этого столбца df ['mynewvalue']?

1 Ответ

1 голос
/ 27 июня 2019

Ошибки происходят из условий:

conditions = [
    ... ,
    (df['text'] in someList),
    (df['text'] in someOtherList),
    (df['text'] in someThirdList)]

Вы пытаетесь спросить, есть ли несколько элементов в списке.Ответ - список (для каждого элемента).Как следует из ошибки, вы должны решить, проверяется ли условие, когда хотя бы один элемент проверяет свойство (any) или все элементы проверяют свойство (any).

Одним из решений является использование isin (doc) или all (doc) для pandas данных.

Здесь используетсяany:

import pandas as pd
import numpy as np

# Information in my columns look something like this:
df = pd.DataFrame()

df['text'] = ['dab', 'def', 'bla', 'zdag', 'etc']
df['values1'] = [3, 4, 2, 5, 2]
df['values2'] = [6, 3, 21, 44, 22]
df['values3'] = [103, 444, 33, 425, 200]

# other lists to test against whether
someList = ['dab', 'bla']
someOtherList = ['def', 'zdag']
someThirdList = ['etc']

conditions = [
    (df['text'] is None),
    (df['text'].isin(someList)),
    (df['text'].isin(someOtherList)),
    (df['text'].isin(someThirdList))]
choices = [0,
           round(df['values2'] * 0.5 * df['values3'], 2),
           df['values1'] + df['values2'] - df['values3'],
           df['values1'] + 249]
df['mynewvalue'] = np.select(conditions, choices, default=0)
print(df)
#    text  values1  values2  values3  mynewvalue
# 0   dab        3        6      103       309.0
# 1   def        4        3      444      -437.0
# 2   bla        2       21       33       346.5
# 3  zdag        5       44      425      -376.0
# 4   etc        2       22      200       251.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...