数据预处理

import os

os.makedirs(os.path.join(‘…’, ‘data’), exist_ok=True)
data_file = os.path.join(‘…’, ‘data’, ‘house_tiny.csv’)
with open(data_file, ‘w’) as f:
f.write(‘NumRooms,Alley,Price\n’)
f.write(‘NA,Pave,127500\n’)
f.write(‘2,NA,106000\n’)
f.write(‘4,NA,178100\n’)
f.write(‘NA,NA,140000\n’)

import pandas as pd

data = pd.read_csv(data_file)
print(data)

data = data.drop(columns=data.columns[[i for i,x in enumerate(list(data.isnull().sum())) if x==max(list(data.isnull().sum()))]])

data.iloc[:,0] = data.iloc[:,0].fillna(data.iloc[:,0].mean())

import numpy as np
import tensorflow as tf
tf.constant(np.array(data))

如下是我的作业,请指正,谢谢。在jupyter py3.8下运行 :grinning:

pandas的新版本参数变动很大,但凡你直接复制代码还报错,或者显示的数据类型于教材不符,优先考虑是pandas的问题。建议学的时候网页开着pandas的说明书

运行所给代码进行数值列缺失值补全平均值的时候,会报错不能让str和int相加,我通过找出所有数值列可以解决这个问题,要将数值列和非数值列分开处理,下面是我的代码`data = pd.read_csv(data_file)

#替换所有的数值列的缺失值为该列平均值

data = data.apply(pd.to_numeric, errors=‘ignore’)

numerical_columns = data.select_dtypes(include=‘number’).columns

data[numerical_columns] = data[numerical_columns].fillna(data[numerical_columns].mean())
`

import os
import pandas as pd

os.makedirs(os.path.join(os.getcwd(), ‘testproject’), exist_ok=True)
data_file=os.path.join(os.getcwd(), ‘testproject’, ‘data.csv’)

with open(data_file, ‘w’, newline=‘’) as f:
f.write(‘NumRooms,Alley,Price,NODATA\n’) # 列名
f.write(‘NA,Pave,127500,NA\n’) # 每行表示一个数据样本
f.write(‘2,NA,106000,NA\n’)
f.write(‘4,NA,178100,NA\n’)
f.write(‘NA,Pave,160000,NA\n’)
f.write(‘1,NA,110000,NA\n’)
f.write(‘NA,NA,180000,NA\n’)

data = pd.read_csv(data_file)

#替换所有的数值列的缺失值为该列平均值

data = data.apply(pd.to_numeric, errors=‘ignore’)

numerical_columns = data.select_dtypes(include=‘number’).columns

data[numerical_columns] = data[numerical_columns].fillna(data[numerical_columns].mean())

print(data)
print(‘\n’)

data = pd.get_dummies(data, dummy_na=True)

print(data)
print(‘\n’)

data = data.drop(columns=‘NODATA’)

print(data)
print(‘\n’)
#这是我的完整作业

2.2.2. 处理缺失值

inputs, outputs = data.iloc[:, 0:2], data.iloc[:, 2]
inputs = inputs.fillna(inputs.mean())
print(inputs)

运行此段代码时

inputs = inputs.fillna(inputs.mean())

这一行抛出了如下错误
TypeError: can only concatenate str (not “int”) to str

而英文版此处的代码则可以顺利运行

inputs, targets = data.iloc[:, 0:2], data.iloc[:, 2]
inputs = pd.get_dummies(inputs, dummy_na=True)
print(inputs)
  1. 删除缺失值最多的列。

计算每一列的缺失值数量

missing_values_count = data.isna().sum()

找出缺失值最多的列

col_with_most_missing = missing_values_count.idxmax()

删除缺失值最多的列

df = data.drop(columns=[col_with_most_missing])

为什么这里提示can only concatenate str (not “int”) to str


最终不是0/1表示,而是bool类型,如何不报错

1 Like
inputs, outputs = data.iloc[:, 0:1], data.iloc[:, 2]

inputs = inputs.fillna(inputs.mean())

inputs = pd.concat([inputs, data.iloc[:, 1].reset_index(drop=True)], axis=1)

print(inputs)

是的,他好像不能处理字符类型,所以可以先处理整型,然后再拼接上即可。

2.2.2. 处理缺失值

此处代码报错,应该修改为

添加指令只选择数值列并计算均值

inputs = inputs.fillna(inputs.mean(numeric_only=True))

import os

os.makedirs(os.path.join('..', 'data'), exist_ok=True)
data_file2 = os.path.join('..', 'data', 'house_tiny2.csv')
with open(data_file2, 'w') as f:
    f.write('NumRooms,Alley,Size,Discount,Price\n')  # 列名
    f.write('NA,Pave,100,0.8,127500\n')  # 每行表示一个数据样本
    f.write('2,Pave,80,0.8,106000\n')
    f.write('3,NA,NA,NA,140000\n')
    f.write('4,Soil,NA,NA,178100\n')
    f.write('NA,NA,NA,NA,130000\n')

data2 = pd.read_csv(data_file2)

inputs2, outputs2 = data2.iloc[:, 0:4], data2.iloc[:, 4]
print(inputs2)

nas = inputs2.isna().sum(axis=0) 
naMax = nas.max() # find the max na
naIndices = nas[nas == naMax].index # get the indices with max na
print(naIndices)
result = inputs2.drop(naIndices, axis=1) # remove columns

result.fillna(result.mean(numeric_only=True), inplace=True)
result = pd.get_dummies(result, dummy_na=True, dtype=int)

print(result)

X, y = torch.tensor(result.values), torch.tensor(outputs2.values)
X, y

参考楼上两位佬的代码,继续修改为
inputs = inputs.drop(columns=[inputs.isna().sum().idxmax()])