在 Python 中的某些 Dataframe 列上进行插补
Posted
技术标签:
【中文标题】在 Python 中的某些 Dataframe 列上进行插补【英文标题】:Imputer on some Dataframe columns in Python 【发布时间】:2016-11-29 18:22:26 【问题描述】:我正在学习如何在 Python 上使用 Imputer。
这是我的代码:
df=pd.DataFrame([["XXL", 8, "black", "class 1", 22],
["L", np.nan, "gray", "class 2", 20],
["XL", 10, "blue", "class 2", 19],
["M", np.nan, "orange", "class 1", 17],
["M", 11, "green", "class 3", np.nan],
["M", 7, "red", "class 1", 22]])
df.columns=["size", "price", "color", "class", "boh"]
from sklearn.preprocessing import Imputer
imp=Imputer(missing_values="NaN", strategy="mean" )
imp.fit(df["price"])
df["price"]=imp.transform(df["price"])
但是,这会引发以下错误: ValueError:值的长度与索引的长度不匹配
我的代码有什么问题???
感谢您的帮助
【问题讨论】:
【参考方案1】:我想你想为 imputer 指定轴,然后转置它返回的数组:
import pandas as pd
import numpy as np
df=pd.DataFrame([["XXL", 8, "black", "class 1", 22],
["L", np.nan, "gray", "class 2", 20],
["XL", 10, "blue", "class 2", 19],
["M", np.nan, "orange", "class 1", 17],
["M", 11, "green", "class 3", np.nan],
["M", 7, "red", "class 1", 22]])
df.columns=["size", "price", "color", "class", "boh"]
from sklearn.preprocessing import Imputer
imp=Imputer(missing_values="NaN", strategy="mean",axis=1 ) #specify axis
q = imp.fit_transform(df["price"]).T #perform a transpose operation
df["price"]=q
print df
【讨论】:
谢谢瑞恩。真的很有用。 不幸的是,这对我不起作用:( ValueError: Expected 2D array, got 1D array instead:【参考方案2】:这是因为Imputer
通常与 DataFrames 而不是 Series 一起使用。一个可能的解决方案是:
imp=Imputer(missing_values="NaN", strategy="mean" )
imp.fit(df[["price"]])
df["price"]=imp.transform(df[["price"]]).ravel()
# Or even
imp=Imputer(missing_values="NaN", strategy="mean" )
df["price"]=imp.fit_transform(df[["price"]]).ravel()
【讨论】:
这里为什么需要ravel()
?没有它似乎返回正确的类型
1.如果您正在制作二维 df[["price"]] ,则不需要 ravel() 。为了让 Imputer 和 fit_transform 工作,我们只需要二维。 df[["price"]] 将数据转换为二维。格式(行数,1)。 2. 如果您使用 1 维 - df["price"],则以下内容仍然有效,但也会返回错误 - ValueError: Expected 2D array, got 1D array instead: array df["price"]=imp.fit_transform (df["price"]).ravel()【参考方案3】:
简单的解决方案是提供一个二维数组
df=pd.DataFrame([["XXL", 8, "black", "class 1", 22],
["L", np.nan, "gray", "class 2", 20],
["XL", 10, "blue", "class 2", 19],
["M", np.nan, "orange", "class 1", 17],
["M", 11, "green", "class 3", np.nan],
["M", 7, "red", "class 1", 22]])
df.columns=["size", "price", "color", "class", "boh"]
from sklearn.preprocessing import Imputer
imp=Imputer(missing_values="NaN", strategy="mean" )
imp.fit(df[["price"]])
df["price"]=imp.transform(df[["price"]])
df['boh'] = imp.fit_transform(df[['price']])
这是你的数据框
Cleaned DataFrame
【讨论】:
【参考方案4】:这里是 Simple Imputer 的文档。对于 fit 方法,它将类数组或稀疏矩阵作为输入参数。 你可以试试这个:
imp.fit(df.iloc[:,1:2])
df['price']=imp.transform(df.iloc[:,1:2])
提供索引位置以适应方法,然后应用变换。
>>> df
size price color class boh
0 XXL 8.0 black class 1 22.0
1 L 9.0 gray class 2 20.0
2 XL 10.0 blue class 2 19.0
3 M 9.0 orange class 1 17.0
4 M 11.0 green class 3 NaN
5 M 7.0 red class 1 22.0
你可以为boh
做同样的事情
imp.fit(df.iloc[:,4:5])
df['price']=imp.transform(df.iloc[:,4:5])
>>> df
size price color class boh
0 XXL 8.0 black class 1 22.0
1 L 9.0 gray class 2 20.0
2 XL 10.0 blue class 2 19.0
3 M 9.0 orange class 1 17.0
4 M 11.0 green class 3 20.0
5 M 7.0 red class 1 22.0
如果我错了,请纠正我。建议将不胜感激。
【讨论】:
以上是关于在 Python 中的某些 Dataframe 列上进行插补的主要内容,如果未能解决你的问题,请参考以下文章
Spark/Scala:对带有数组类型列的 DataFrame 中的某些组件的操作
在 Python Pandas DataFrame 或 Jupyter Notebooks 中包装列名