如何替换csv文件中一列中最高的10个值?



数据集: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)
  1. 您正在对pandas对象使用numpy函数。这可能有效,但访问底层np.array是一个很好的实践。
  2. 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)

最新更新