Добавление нового столбца данных pandas с заполнением его условными вычислениями (среднее значение if, стандартное отклонение if) - PullRequest
0 голосов
/ 04 июля 2019

Мне нужно добавить 2 столбца во фрейм данных Pandas, заполненный условным средним и стандартным отклонением.

# Import pandas library 
import pandas as pd 

# Initialize list of lists 
data = [
    ['Tom',   'Blue', 'Small',  10, ], 
    ['Tom',   'Blue', 'Big',    15, ], 
    ['Tom',   'Red',  'Big',     3, ], 
    ['Tom',   'Red',  'Small',   8, ], 
    ['Tom',   'Red',  'Medium',  5, ], 
    ['Tom',   'Blue', 'Medium', 12, ], 
    ['Nick',  'Blue', 'Small',  15, ], 
    ['Nick',  'Red',  'Medium', 11, ], 
    ['Nick',  'Red',  'Small',  17, ], 
    ['Julie', 'Blue', 'Big',    14, ], 
    ['Julie', 'Red',  'Big',    11, ],
    ['Julie', 'Red',  'Medium',  3, ], 
    ['Julie', 'Red',  'Medium',  4, ],
]

# Create the pandas DataFrame 
df = pd.DataFrame(data, columns = ['Name', 'Colour', 'Size', 'Age']) 

# print dataframe. 
df

В этом примере мне нужно добавить 2 столбца: df['mean'] и df['std'] в зависимости только от названия и цвета.

Я просмотрел документацию .mean() и .std(), но не нашел способа добавить набор условий. Я полагаю, что мне могут понадобиться 2 функции, которые для каждой строки принимают имя и цвет в качестве аргументов, вычисляют среднее значение или стандартное отклонение для всей серии, а затем заполняют новые столбцы.

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.std.html

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

Я знаю, как применить .mean или .std ко всей серии панд без условий:

df['Age'].std()

или

df['Age'].mean()

Я также обнаружил, что преобразование «группа +» делает что-то немного похожее без возможности динамической проверки каждой строки, как могла бы функция.

df['mean'] = df.groupby(['Name','Colour']).transform('mean')

Спасибо за вашу помощь.

Вот результат, который я ожидал. Спасибо за ответы: Выходной кадр данных

1 Ответ

0 голосов
/ 04 июля 2019

Поскольку transform не поддерживает std, мы можем обойти groupby().agg и merge:

new_df = df.groupby(['Name', 'Colour']).Age.agg({'mean','std'})
df = df.merge(new_df, left_on=['Name', 'Colour'], right_index=True)

Вывод:

     Name Colour    Size  Age       std       mean
0     Tom   Blue   Small   10  2.516611  12.333333
1     Tom   Blue     Big   15  2.516611  12.333333
5     Tom   Blue  Medium   12  2.516611  12.333333
2     Tom    Red     Big    3  2.516611   5.333333
3     Tom    Red   Small    8  2.516611   5.333333
4     Tom    Red  Medium    5  2.516611   5.333333
6    Nick   Blue   Small   15       NaN  15.000000
7    Nick    Red  Medium   11  4.242641  14.000000
8    Nick    Red   Small   17  4.242641  14.000000
9   Julie   Blue     Big   14       NaN  14.000000
10  Julie    Red     Big   11  4.358899   6.000000
11  Julie    Red  Medium    3  4.358899   6.000000
12  Julie    Red  Medium    4  4.358899   6.000000
...