如何在python中忽略.csv文件中的Nan?

如何在python中忽略.csv文件中的Nan?,python,scikit-learn,missing-data,Python,Scikit Learn,Missing Data,我在读取.csv文件的列时遇到问题。我有以下代码: # Importing the libraries import numpy as np import matplotlib.pyplot as plt import pandas as pd from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression from sklearn.metrics i

我在读取.csv文件的列时遇到问题。我有以下代码:

# Importing the libraries
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import confusion_matrix
from sklearn.metrics import classification_report
from sklearn.ensemble import RandomForestClassifier
from sklearn.svm import SVC
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler


# Importing the dataset
dataset = pd.read_csv('D:/CTU/ateroskleroza/development/results_output6.csv')
print(dataset.head())


X = dataset.iloc[:, 2:16].values
y = dataset.iloc[:, 0].values


# Splitting the dataset into the Training set and Test set

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25)

classifier = make_pipeline(StandardScaler(), SVC(gamma='auto'))
classifier.fit(X_train, y_train)

y_pred = classifier.predict(X_test)

# Making the Confusion Matrix

cm = confusion_matrix(y_test, y_pred)
print(cm)
# Generating accuracy, precision, recall and f1-score

target_names = ['Progressive','Stable']
print(classification_report(y_test, y_pred, target_names=target_names))
.csv的格式如下所示:

根据图片的名称,它们有一些列,另一些列与Nan一起。问题是,当我尝试执行此代码时,出现以下错误:

ValueError: Input contains NaN, infinity or a value too large for dtype('float64').

那么我怎么能忽略Nan而只使用数字呢?(我不想删除空列,只需在执行时忽略Nan即可)。

我根据个人经验编写此答案。如果你想要一个更详细的答案,考虑用一个我们可以使用的数据集来更新你的文章,说明模型应该预测和描述的特性。 @simpleApp建议在缩放数据和拟合模型之前将空值替换为零。在评论中,您似乎担心在最终模型上输入空值的影响

在处理缺失数据时,您必须权衡插补值的利弊。如果您决定忽略具有空值的观测值(通过删除列或整个观测值),您可能会错过一些真正重要的信息,并且您将无法对新观测值进行预测,除非它们的数据完全满了。同样,如果不小心用一些随机值输入空值,可能会给模型引入偏差

如果您正确地输入值,您的模型将能够处理丢失的数据,而不会影响其准确性。遗憾的是,估算价值与其说是一门硬科学,不如说是一门艺术

我不知道你的数据意味着什么,但把年龄作为预测心脏病风险的独立变量。扪心自问:如果缺少一个值,我是否最好忽略观察结果,或者我是否可以用一个平均不应该离患者实际未观察年龄太远的值来填补空白

如果您决定用一些值填充缺少的信息,我建议使用四种非常简单的方法:

#用最小值填充
df=df.fillna(df.mean(),轴=1)
#用中值填充
df=df.fillna(df.median(),轴=0)
#用平均值填充
df=df.fillna(df.mean(),轴=0)
#用最大值填充
df=df.fillna(df.max(),轴=0)
您的下一步应该是对结果模型进行评分,并选择对看不见的数据进行最佳概括的模型

在其他常见的插补技术中,您可以使用零(
df.fillna(0)
)填充空值,使用最频繁的值(检查)或更复杂的插补技术,例如

最后,当您在看不见的数据上测试模型的性能时,您将发现输入null是否正确


作为一般的经验法则,你应该考虑删除所有超过20%个值的列。

你需要有一个策略,它可以是<代码> DF.FILNA(0)等等。@ SimeApp,但是我的结果会改变,对吧?因为我给一个Nan赋值,如果我用这个结果训练,他们会影响最终的结果是不是。每当有Nan值时,就需要一些攻击计划。如果该功能过于稀疏,请删除它,或者用一些值替换它。非常感谢!!我真的很感激你的回答。关键是我不想填补NaN的空缺,我只想忽略他们。这是不可能的吗?不,这是不可能的,尤其是对于SVC模型。要么i)删除带有NaN的行,要么ii)删除这些列,要么iii)填充空值。仔细想想,不传递值本身就是信息。所以你永远不能真正“忽略”南。我们只是填充它们以避免数据类型冲突。