将自定义函数应用于 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
,它会按列的每个值循环。错误意味着标量没有 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)
或者像@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"])
我想为 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
,它会按列的每个值循环。错误意味着标量没有 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)
或者像@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"])