数据集:https://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/winequality-red.csv
编辑:使用@Maow建议的变更更新代码。
我目前正在做一个项目,需要我分析葡萄酒的数据。我在csv文件的每一列都发现了一些极端的异常值。简而言之,我决定每一列的最高10个值必须用该列的中值替换。我在一篇文章的帮助下尝试了以下方法(Pandas Replace certain values in each column),我修改了它,如下所示,但不幸的是,这是我第一次使用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文件中的缺失值,但我没有。我也不确定如果上面的代码将帮助我实现我的目标,即使没有这个错误。任何帮助表示感谢。
2条答案
按热度按时间mftmpeh81#
出现此错误是因为您使用
np.select
错误。它需要条件数组、选择数组和默认值,顺序为。它可以和
1.你在panda对象上使用了一个numpy函数。这可能会起作用,但是访问底层的
np.array
是一个很好的习惯。1.另外,
np.select
并没有做你认为它做的事情,它的目的是根据条件列表中的第一个匹配项从数组中选择一个元素,所以你基本上选择了属于最大的10个元素的第一个值。最后注意:通过调用
set_index
两次,基本上可以使citric acid
再次成为一个值。编辑:
np.select
函数需要一个list of bool ndarrays
,也就是一个2d的数据结构。如果你看condition
,它看起来像这样。.reshape
将更改数组的形状。-1
是保持行数不变的快捷方式,而1
表示您创建了每行只有一个元素的冗余数组。这是为了匹配预期签名。
mkshixfv2#
想出了一个算法: