将自定义函数应用于 pandas 系列会产生 AttributeError

Applying a custom function to pandas Series produces AttributeError

我想为 pandas 系列创建自定义汇总函数。

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'

我想我在这里做错了。任何人都可以帮助我如何正确应用该功能吗?

如果使用Series.apply,它会按列的每个值循环。错误意味着标量没有 minmax

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)

或者像@AkshayNevrekar 在评论中提到的那样将 Series 传递给函数:

min_max(df["tmk"])

另一个想法是使用 DataFrame.apply - 为一列添加 [] DataFrame:

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

Min: 4.0 | Max: 5.0

另一种方法是使用 Series.describe or 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

也可以像@Jon Clements 提到的那样添加 format,谢谢:

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

Min: 4.0 | Max: 5.0

如果你只想得到最小值和最大值,使用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

您可以从那里获取最小值、最大值和其他指标

对于此类分析,只需使用 describe 级数方法。

如果你想在这里对你的错误进行一些解释。这样做:

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

您正在将函数应用于系列中的每个值。该值的类型为 'float'。 python 中的浮点数没有方法 max 或 min。相反,您可以使用:

df["tml"].min()

或者可能是内置的 python min/max 比如:

min(df["tml"])