Применение пользовательской функции к серии Pandas приводит к AttributeError - PullRequest
2 голосов
/ 04 ноября 2019

Я хочу создать пользовательскую сводную функцию для серии Панд.

df["tmk"].min()
df["tmk"].max()

это работает.

def min_max(x):
    minimum = x.min()
    maximum = x.max()
    print(f'Min: {minimum} | Max: {maximum}')

df["tmk"].apply(lambda x: min_max(x))

AttributeError: 'float' object has no attribute 'min'

Я предполагаю, что здесь я ошибаюсь. Может кто-нибудь помочь мне с тем, как правильно применить функцию?

Ответы [ 3 ]

3 голосов
/ 04 ноября 2019

Если использовать Series.apply, то цикл выполняется по каждому значению столбца. Ошибка означает, что для скаляров нет min и max.

df = pd.DataFrame({
         'tmk':[4,5,4,5,5,np.nan],
})


def min_max(x):
    minimum = x.min()
    maximum = x.max()
    print(f'Min: {minimum} | Max: {maximum}')

Необходимо обработать все значения столбца с помощью Series.pipe:

df["tmk"].pipe(min_max)

Или передайте Series для работы, как упомянуто @AkshayNevrekar в комментариях:

min_max(df["tmk"])

Другая идея заключается в использовании DataFrame.apply - добавлено [] для одного столбца DataFrame:

df[["tmk"]].apply(min_max)

Min: 4.0 | Max: 5.0

Другой метод - это использование Series.describe или Series.agg:

print (df['tmk'].describe())

count    5.000000
mean     4.600000
std      0.547723
min      4.000000
25%      4.000000
50%      5.000000
75%      5.000000
max      5.000000
Name: tmk, dtype: float64

print (df['tmk'].agg(['min', 'max']))
min    4.0
max    5.0
Name: tmk, dtype: float64

Также возможно добавить format какупомянул @Jon Clements, спасибо:

print ('Min: {min} | Max: {max}'.format_map(df['tmk'].agg(['min', 'max'])))

Min: 4.0 | Max: 5.0
1 голос
/ 04 ноября 2019

Для такого рода анализа просто используйте опишите метод рядов.

Если вы хотите немного объяснить свою ошибку, вот она. Делая это:

df["tmk"].apply(lambda x: min_max(x))

вы применяете свою функцию к каждому значению в вашей серии. Это значение имеет тип «float». У поплавков в питоне нет метода max или min. Вместо этого вы можете использовать:

df["tml"].min()

или, возможно, встроенный python min / max, например:

min(df["tml"])
0 голосов
/ 04 ноября 2019

Если вы просто хотите получить Min и Max, вам может быть проще использовать describe() метод

import pandas as pd
import numpy as np

# fix seeds so we get the same numbers
np.random.seed(42)
a = np.random.normal(0, 1, 10)
np.random.seed(42)
b = np.random.uniform(0, 1, 10)

df = pd.DataFrame({"A": a, "B": b})
df.describe()

>>>            A          B
count  10.000000  10.000000
mean    0.448061   0.520137
std     0.723008   0.315866
min    -0.469474   0.058084
25%    -0.210169   0.210649
50%     0.519637   0.599887
75%     0.737498   0.726014
max     1.579213   0.950714

Вы можете получить минимальные, максимальные и другие метрики оттуда

...