数据集:https://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/winequality-red.csv
编辑:更新代码与@Maow建议的更改。
我目前正在做一个项目,需要我分析葡萄酒的数据。我在csv文件的每一列中都发现了一些极端的异常值。简而言之,我已经确定每列的前10个值必须用该列的中位数替换。我在1篇文章的帮助下尝试了以下方法(Pandas替换每列中的某些值),并将其修改为如下所示,但不幸的是,这是我第一次使用python,我不知道是什么导致了错误。
import pandas as pd
import numpy as np
df = pd.read_csv('C:/Users/hello/Downloads/winequality-red-ori.csv')
def cut(column):
condition = column > np.percentile(column,99.26470588) //Top 10 rows out of 1360 rows
replacewith = np.median(column) //replace with median
np.select(condition.values.reshape(-1, 1), column.values, replacewith) //input changes
df.set_index(["citric acid", "quality"], inplace=True) //exclude citric acid and quality
df = df.apply(lambda x: cut(x)).reset_index()
df.to_csv('C:/Users/hello/Downloads/new.csv')
我试着研究是什么原因导致错误,包括csv文件中缺失的值,但我没有。我也不确定如果上面的代码将帮助我实现我的目标,即使没有这个错误。谢谢你的帮助。
由于使用np.select
错误而出现错误。它期望一个条件数组、一个选择数组和一个默认值。
与
一起使用np.select(condition.values.reshape(-1, 1), column.values, replacewith)
- 您正在对pandas对象使用numpy函数。这可能有效,但访问底层
np.array
是一个很好的实践。 np.select
也没有做你认为它做的事情。它的目的是根据条件列表中的第一个命中值从数组中选择单个元素。所以你基本上选择第一个属于10个最大的值。
最后注意:通过调用set_index
两次,您基本上再次使citric acid
成为一个值。你应该调用
df.set_index(["citric acid", "quality"], inplace=True) # exclude citric acid and quality
编辑:np.select
函数期望list of bool ndarrays
,即根据文档的2d数据结构。如果你看condition
,它是这样的
In [35]: condition
Out[35]: array([False, False, False, ..., False, False, False])
.reshape
将改变数组的形状。-1
是保持行数相同的快捷方式,1
意味着您创建一个冗余的数组,每行只有一个元素。
In [36]: condition.reshape(-1, 1)
Out[36]:
array([[False],
[False],
[False],
...,
[False],
[False],
[False]])
这是为了匹配期望的签名。
算出一个算法:
condition = column > np.percentile(column,99.26470588)
replacewith = np.median(column) #replace with median
return np.where(condition,replacewith,column.values)