Как я могу создать и использовать новую функцию в DataFrame? - PullRequest
1 голос
/ 20 октября 2019

Как я могу создать новую функцию и использовать эту новую функцию в моем DataFrame, чтобы добавить новый столбец во время агрегации? Из моего DataFrame я взял «Направление ветра» и «Температура», и для этих столбцов я хочу объединить его и создать таблицу со средним значением «Направление ветра» и разницей между значением для всех городов и средним значением «aa», и то же самое для «Температура». Тем не менее, в столбце, где я использую свою функцию «aa», у меня есть 0. В чем проблема, не могли бы вы написать мне соответствующую строку кода?

def aa(x):
    return x - np.mean(x)

file.groupby(["City"]).agg({"Wind direction":[np.mean, aa], "Temperature":["mean", aa]})

1 Ответ

0 голосов
/ 21 октября 2019

Вы применяете aa на неправильном уровне группировки. Вот краткий пример:

np.random.seed(1)
size = 10
file = pd.DataFrame({
    'City': np.random.choice(list(string.ascii_uppercase), size),
    'Wind direction': np.random.randint(0, 360, size),
    'Temperature': np.random.randint(1, 100, size)
}).sort_values('City').reset_index(drop=True)

df:

  City  Wind direction  Temperature
0    A             252           87
1    F             129           30
2    F             254           95
3    I             281           69
4    J             178           88
5    L              71           15
6    L             276           88
7    M             237           51
8    P             357           97
9    Q             156           14

Ваш оригинальный код ...

def aa(x):
    return x - np.mean(x)

file.groupby(["City"]).agg({"Wind direction":[np.mean, aa], "Temperature":["mean", aa]})

.. производит:

     Wind direction                  Temperature               
               mean               aa        mean             aa
City                                                           
A             252.0                0        87.0              0
F             191.5    [-62.5, 62.5]        62.5  [-32.5, 32.5]
I             281.0                0        69.0              0
J             178.0                0        88.0              0
L             173.5  [-102.5, 102.5]        51.5  [-36.5, 36.5]
M             237.0                0        51.0              0
P             357.0                0        97.0              0
Q             156.0                0        14.0              0

Обратите внимание, как только те города, которые появляются дважды, имеют значения в таблице результатов? Если у вас есть только одна точка данных для города, x == np.mean(x), поэтому их разница равна 0.


Решение

Определите вашу агрегатную функцию как:

def aa(col):
    # Difference between the local (city) mean and the global (entire column) mean
    return col.mean() - file[col.name].mean()

file.groupby(["City"]).agg({"Wind direction":[np.mean, aa], "Temperature":["mean", aa]}) 

Результат:

     Wind direction        Temperature      
               mean     aa        mean    aa
City                                        
A             252.0   32.9        87.0  23.6
F             191.5  -27.6        62.5  -0.9
I             281.0   61.9        69.0   5.6
J             178.0  -41.1        88.0  24.6
L             173.5  -45.6        51.5 -11.9
M             237.0   17.9        51.0 -12.4
P             357.0  137.9        97.0  33.6
Q             156.0  -63.1        14.0 -49.4
...