"fillna" python 中的命令未返回意味着使用 pandas

"fillna" command in python not returning mean using pandas

我正在尝试 运行 python 中的 fillna 命令。它根本无法用任何东西替换 Nan 值,而且它不会 return 错误。

import pandas as pd
import io
import requests
import numpy as np
url='https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data'
s=requests.get(url).content
df=pd.read_csv(io.StringIO(s.decode('utf-8')))
df.columns=['Scn', 'A2', 'A3', 'A4', 'A5', 'A6', 'A7', 'A8', 'A9', 'A10', 'CLASS']


df.to_csv("wisconsinbreast.csv")

m,n=df.shape
#print(m,n)
df = df.replace('?', np.nan)
#print(df)
#print(df.mean()) 
print(df.fillna(df.mean()))

第22行,Nan还在。我已经完成了通过在此处搜索问题可以找到的所有内容,但这甚至没有给我关于失败原因的反馈。据我了解,df.mean 应该在没有 Nan 值的情况下进行计算,但是 df.mean 不会 return 包含 Nan 的列的值。

na_valuesread_csv

'?' 把一切都搞砸了。当 read_csv 看到它时,它假定整个列都是 dtype object 并将其作为字符串读入。当然,你可以在事后解决这个问题,但我建议在开始时使用 na_values 参数来阻止它:

df = pd.read_csv(io.StringIO(s.decode('utf-8')), na_values=['?'])

pd.to_numeric

但如果你真的想在事后修复它,请执行此操作而不是 replace

df.A7 = pd.to_numeric(df.A7, errors='coerce')

无论哪种情况,fillna 之后都会按预期工作

df.fillna(df.mean())

         Scn  A2  A3  A4  A5  A6         A7  A8  A9  A10  CLASS
0    1002945   5   4   4   5   7  10.000000   3   2    1      2
1    1015425   3   1   1   1   2   2.000000   3   1    1      2
2    1016277   6   8   8   1   3   4.000000   3   7    1      2
3    1017023   4   1   1   3   2   1.000000   3   1    1      2
4    1017122   8  10  10   8   7  10.000000   9   7    1      4
5    1018099   1   1   1   1   2  10.000000   3   1    1      2
6    1018561   2   1   2   1   2   1.000000   3   1    1      2
7    1033078   2   1   1   1   2   1.000000   1   1    5      2
8    1033078   4   2   1   1   2   1.000000   2   1    1      2
9    1035283   1   1   1   1   1   1.000000   3   1    1      2
10   1036172   2   1   1   1   2   1.000000   2   1    1      2
11   1041801   5   3   3   3   2   3.000000   4   4    1      4
12   1043999   1   1   1   1   2   3.000000   3   1    1      2
13   1044572   8   7   5  10   7   9.000000   5   5    4      4
14   1047630   7   4   6   4   6   1.000000   4   3    1      4
15   1048672   4   1   1   1   2   1.000000   2   1    1      2
16   1049815   4   1   1   1   2   1.000000   3   1    1      2
17   1050670  10   7   7   6   4  10.000000   4   1    2      4
18   1050718   6   1   1   1   2   1.000000   3   1    1      2
19   1054590   7   3   2  10   5  10.000000   5   4    4      4
20   1054593  10   5   5   3   6   7.000000   7  10    1      4
21   1056784   3   1   1   1   2   1.000000   2   1    1      2
22   1057013   8   4   5   1   2   3.548387   7   3    1      4
23   1059552   1   1   1   1   2   1.000000   3   1    1      2
24   1065726   5   2   3   4   2   7.000000   3   6    1      4