TypeError: float() argument must be a string or a number, not 'function' – Python/Sklearn

8 浏览
0 Comments

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'

我目前不知道如何遍历数据框并找到/转换出错的条目。

0
0 Comments

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的所有提案

0
0 Comments

这个问题的出现是因为在使用`fillna`函数时,传入了一个函数作为参数,而`fillna`函数期望传入的是一个字符串或数字,而不是函数。因此,函数将无法将NA单元格的值设置为您提供的函数本身,而是尝试将其转换为浮点数。

要解决这个问题,您需要将函数更改为返回一个字符串或数字,以便`fillna`函数可以正确使用它。以下是一个示例解决方法:

df = df.fillna(df.median())

这样,`fillna`函数将使用每列的中位数来填充NA单元格,而不是尝试将函数本身转换为浮点数。

更多关于`fillna`函数的详细信息,请参考官方文档:https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.fillna.html

0
0 Comments

这个问题的出现原因是`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)中继续讨论。

0