Python: оцените вывод моих функций - PullRequest
0 голосов
/ 01 марта 2019

У меня большой массив данных со многими столбцами, но я рассматриваю только один столбец.

Этот пример для простоты.Я определил новый столбец col2, в котором будет храниться логическое значение, если будут выполнены условия первого столбца.

raw_data = { 'col1': [[0, 2, 3, 4],[6, 7, 1000, 40, 20],[4, 20, 100]]}
df = pd.DataFrame(raw_data, columns = ['col1'])
df

df['col2'] = 'default'
df

                     col1                   col2
row1         [2,3,44,89.6,...]            default
row2         [10,4,33.3,1.11,...]         default

Мне нужно выполнить некоторые вычисления для столбца col1 и, если выполняются некоторые условия, по умолчаниюв столбце col2 в той же строке устанавливается значение True, в противном случае - значение False.

Упрощенные вычисления

Рассчитать максимальное значение в списке, длину списка и среднее значение.

Я выполняю эти вычисления в функции, а затем ввожу другую функцию, которая пытается выполнить часть оценки.

Например, если максимальное значение> 10 и длина списка равна> 5 и если среднее значение> 25, установите значение по умолчанию в col2 равным True.

Я считаю, что мне нужно использовать функцию .apply ().

df['col2'] = df.apply (lambda row: my_functions (row),axis=1)

Требуемый вывод

                   col1                   col2
row1         [2,3,44,89.6,...]            True
row2         [10,4,33.3,1.11,...]         False

Я застрял здесь, поскольку не знаю, как выполнять некоторые вычисления, выполнять итерацию по всему столбцу и оценивать эти вычисления.

Спасибо!

Ответы [ 3 ]

0 голосов
/ 01 марта 2019

вот один из способов сделать:

raw_data = {'col1': [[0, 2, 3, 4], [6, 7, 1000, 40, 20, 13], [4, 20, 100]]}
df = pd.DataFrame(raw_data, columns=['col1'])

def my_functions(r):
    nb = len(r.col1)
    average = sum(r.col1) / nb
    maxl = max(r.col1)
    return maxl > 10 and len(r.col1) > 5 and average > 25


df['col2'] = df.apply(lambda row: my_functions(row), axis=1)
print(df)

вывод:

                       col1   col2
0              [0, 2, 3, 4]  False
1  [6, 7, 1000, 40, 20, 13]   True
2              [4, 20, 100]  False
0 голосов
/ 02 марта 2019

Вы можете использовать векторизованные функции, если у вас большой фрейм данных:

def my_func(l):
    return (max(l) > 10) and (len(l) > 5) and (np.mean(l) > 25)

my_func = np.vectorize(my_func)

df['col2'] = my_func(df['col1'].values)

ВЫХОД:

col1                        col2
[0, 2, 3, 4]                False
[6, 7, 1000, 40, 20, 13]    True
[4, 20, 100]                False
0 голосов
/ 01 марта 2019

Есть несколько способов сделать это, но вам не нужно устанавливать col2 перед выполнением вычисления.Вы можете добавить функцию по вашему выбору в атрибут apply.Просто помните, что входные данные для функции с использованием apply - это строка за строкой .

raw_data = { 'col1': [[0, 2, 3, 4],[6, 7, 1000, 40, 20],[4, 20, 100]]}
    df = pd.DataFrame(raw_data, columns = ['col1'])

    # if max(list) > 10 --> True

def my_function (row):

    if max(row['col1'])>10:
        row = True
    else:
        row = False
    return row


df['col2'] = df.apply(my_function, axis =1)

df
                   col1   col2
0          [0, 2, 3, 4]  False
1  [6, 7, 1000, 40, 20]   True
2          [4, 20, 100]   True
...