TypeError: float() argument must be a string or a number, not 'function' – Python/Sklearn
TypeError: float() argument must be a string or a number, not 'function' – Python/Sklearn
我从一个叫做Flights.py的程序中得到了以下的代码片段:
... #加载数据集 df = dataset df.isnull().any() df = df.fillna(lambda x: x.median()) # 定义X和Y X = df.iloc[:, 2:124].values y = df.iloc[:, 136].values X_tolist = X.tolist() # 将数据集分为训练集和测试集 from sklearn.cross_validation import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 0) # 特征缩放 from sklearn.preprocessing import StandardScaler sc = StandardScaler() X_train = sc.fit_transform(X_train) X_test = sc.transform(X_test)
倒数第二行出现了以下错误:
Traceback (most recent call last): File "", line 3, in X_train = sc.fit_transform(X_train) File "/Users/ /anaconda/lib/python3.6/site-packages/sklearn/base.py", line 494, in fit_transform return self.fit(X, **fit_params).transform(X) File "/Users/ /anaconda/lib/python3.6/site-packages/sklearn/preprocessing/data.py", line 560, in fit return self.partial_fit(X, y) File "/Users/ /anaconda/lib/python3.6/site-packages/sklearn/preprocessing/data.py", line 583, in partial_fit estimator=self, dtype=FLOAT_DTYPES) File "/Users/ /anaconda/lib/python3.6/site-packages/sklearn/utils/validation.py", line 382, in check_array array = np.array(array, dtype=dtype, order=order, copy=copy) TypeError: float() argument must be a string or a number, not 'function'
我的数据框df
的大小为(22587, 138)
我参考了以下问题以获得灵感:
TypeError: float() argument must be a string or a number, not 'method' in Geocoder
我尝试了以下调整:
# 特征缩放 from sklearn.preprocessing import StandardScaler sc = StandardScaler() X_train = sc.fit_transform(X_train.as_matrix) X_test = sc.transform(X_test.as_matrix)
结果出现了以下错误:
AttributeError: 'numpy.ndarray' object has no attribute 'as_matrix'
我目前不知道如何遍历数据框并找到/转换出错的条目。
TypeError: float() argument must be a string or a number, not 'function' – Python/Sklearn
在使用df = df.fillna(lambda x: x.median())
时,我遇到了同样的问题。以下是我解决这个问题的方法,以便将真实值而不是'function'填充到数据框中:
# -*- coding: utf-8 -*-
import pandas as pd
import numpy as np
我创建了一个包含10行、3列带有nan值的数据框:
df = pd.DataFrame(np.random.randint(100,size=(10,3)))
df.iloc[3:5,0] = np.nan
df.iloc[4:6,1] = np.nan
df.iloc[5:8,2] = np.nan
为了方便后续操作,给列添加了傻瓜般的标签:
df.columns=['Number_of_Holy_Hand_Grenades_of_Antioch', 'Number_of_knight_fleeings', 'Number_of_rabbits_of_Caerbannog']
print df.isnull().any() # 每列是否有nan值
对于每一列,通过它们的标签,我们将所有的nan值填充为该列自身的中位数。也可以使用均值等计算方法。
for i in df.columns: # 如果有w列的行描述,则使用df.columns[w:]
df[i] = df[i].fillna(df[i].median() )
print df.isnull().any()
现在,df中的nan值已被替换为中位数值。
print df
你可以做一些操作,例如:
X = df.ix[:,:].values
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_std = scaler.fit_transform(X)
这种方法无法使用df = df.fillna(lambda x: x.median())
,因为它不接受函数作为参数。
现在,我们可以在forward方法中使用df,因为所有的值都是真实值,而不是函数。与使用lambda函数填充数据框中的nan值的方法相反,例如:使用fillna结合lambda的所有提案。
这个问题的出现是因为在使用`fillna`函数时,传入了一个函数作为参数,而`fillna`函数期望传入的是一个字符串或数字,而不是函数。因此,函数将无法将NA单元格的值设置为您提供的函数本身,而是尝试将其转换为浮点数。
要解决这个问题,您需要将函数更改为返回一个字符串或数字,以便`fillna`函数可以正确使用它。以下是一个示例解决方法:
df = df.fillna(df.median())
这样,`fillna`函数将使用每列的中位数来填充NA单元格,而不是尝试将函数本身转换为浮点数。
更多关于`fillna`函数的详细信息,请参考官方文档:https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.fillna.html
这个问题的出现原因是`fillna`函数不支持回调函数作为填充值,如果传入回调函数,它会被当作字面填充值,也就是说`NaN`值会被替换为lambda函数。解决方法是创建一个以列为基础的中位数数据框,并将其传递给`fillna`函数。
具体实现如下:
df.fillna(df.median())
如果您传递一个Series,pandas可以对齐它们,所以您实际上不需要进行数据转换或广播。下面的代码可以实现相同的效果:
df.fillna(df.median())
但是,上述方法可能会出现`ValueError: Input contains NaN, infinity or a value too large for dtype('float64')`的错误,这可能是数据的问题。您可以尝试使用`df.clip`来解决,具体使用方法可以参考官方文档:[pandas.DataFrame.clip](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.clip.html)。
如果您仍然发现在调用`df.fillna(df.median())`之后仍存在大量带有NaN值的行,请尝试以下方法:
med = pd.DataFrame(df.transform('median').values[:, None].T * np.ones_like(df), columns=df.columns, index=df.index) df = df.fillna(med)
如果上述方法仍然出现错误`ValueError: transforms cannot produce aggregated results`,您可以提供导致错误的数据片段,以便进行调试。
以上是关于`TypeError: float() argument must be a string or a number, not 'function' – Python/Sklearn`问题的原因及解决方法的整理。如果您对此有更多疑问,我们可以在[聊天室](http://chat.stackoverflow.com/rooms/154634/discussion-between-hmldude-and-cs)中继续讨论。