TypeError: float() 参数必须是字符串或数字,而不是“函数”——Python/Sklearn

新手上路,请多包涵

我从名为 Flights.py 的程序中获得了以下代码片段

...
#Load the Dataset
df = dataset
df.isnull().any()
df = df.fillna(lambda x: x.median())

# Define X and Y
X = df.iloc[:, 2:124].values
y = df.iloc[:, 136].values
X_tolist = X.tolist()

# Splitting the dataset into the Training set and Test set
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)

# Feature Scaling
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 "<ipython-input-14-d4add2ccf5ab>", line 3, in <module>
    X_train = sc.fit_transform(X_train)

  File "/Users/<username>/anaconda/lib/python3.6/site-packages/sklearn/base.py", line 494, in fit_transform
    return self.fit(X, **fit_params).transform(X)

  File "/Users/<username>/anaconda/lib/python3.6/site-packages/sklearn/preprocessing/data.py", line 560, in fit
    return self.partial_fit(X, y)

  File "/Users/<username>/anaconda/lib/python3.6/site-packages/sklearn/preprocessing/data.py", line 583, in partial_fit
    estimator=self, dtype=FLOAT_DTYPES)

  File "/Users/<username>/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() 参数必须是字符串或数字,而不是 Geocoder 中的“方法”

我尝试了以下调整:

 # Feature Scaling
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'

我目前不知道如何扫描数据框并查找/转换有问题的条目。

原文由 HMLDude 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 597
2 个回答

正如 这个答案 所解释的那样, fillna 不适用于回调。如果您传递一个,它将被视为文字填充值,这意味着您的 NaN s 将被替换为 lambda:

 df

      col1  col2  col3  col4
row1  65.0    24  47.0   NaN
row2  33.0    48   NaN  89.0
row3   NaN    34  67.0   NaN
row4  24.0    12  52.0  17.0

df4.fillna(lambda x: x.median())

                                    col1  col2  \
row1                                  65    24
row2                                  33    48
row3  <function <lambda> at 0x10bc47730>    34
row4                                  24    12

                                    col3                                col4
row1                                  47  <function <lambda> at 0x10bc47730>
row2  <function <lambda> at 0x10bc47730>                                  89
row3                                  67  <function <lambda> at 0x10bc47730>
row4                                  52                                  17


如果您尝试按中位数填充,解决方案是基于该列创建一个中位数数据框,并将其传递给 fillna

 df
      col1  col2  col3  col4
row1  65.0    24  47.0   NaN
row2  33.0    48   NaN  89.0
row3   NaN    34  67.0   NaN
row4  24.0    12  52.0  17.0

df.fillna(df.median())
df
      col1  col2  col3  col4
row1  65.0    24  47.0  53.0
row2  33.0    48  52.0  89.0
row3  33.0    34  67.0  53.0
row4  24.0    12  52.0  17.0

原文由 cs95 发布,翻译遵循 CC BY-SA 3.0 许可协议

我在使用 df = df.fillna(lambda x: x.median()) 这是我获取真实值而不是“函数”到数据帧中的解决方案:

 # -*- coding: utf-8 -*-
import pandas as pd
import numpy as np

我用 nan 创建数据框 10 行,3 列

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()  # tell if nan per column

对于通过其标签的每一列,我们通过在列本身上计算的中值填充所有 nan 值。可以与 mean() 等一起使用。

 for i in df.columns:     #df.columns[w:] if you have w column of line description
    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()) 我们现在可以将 df 用于 forward 方法,因为所有值都是真值,而不是函数;与在 dataframe.fillna() 中使用 lambda 的方法相反,例如, 所有使用 fillna 的提案都合并到 lambda

原文由 sol 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题