数据预处理

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()])

交作业:
代码:
我假设是酒店的数据:有钥匙,房间号,床数,是否有窗,浴室类型
#创建包含更多行的原始数据集
import os
import pandas as pd
import torch

os.makedirs(os.path.join(‘…’,‘深度学习’,‘数据预处理’,‘data’),exist_ok=True)
data_file = os.path.join(‘…’,‘深度学习’,‘数据预处理’,‘data’,‘hotel.csv’)
with open(data_file,‘w’) as f:
f.write(‘key,room,bed,wind,bath\n’)
f.write(‘ELE,NA,1,YES,Shower\n’)
f.write(‘NA,202,2,NA,Shower\n’)
f.write(‘ELE,NA,2,NO,NA\n’)
f.write(‘ELE,204,1,NA,NA\n’)
f.write(‘ELE,205,2,NO,Shower\n’)
f.write(‘NA,206,NA,YES,Bathtub\n’)
f.write(‘ELE,NA,1,YES,NA\n’)
f.write(‘NA,208,NA,NA,Shower\n’)
f.write(‘ELE,NA,1,NO,Bathtub\n’)
f.write(‘NA,210,1,YES,NA\n’)
f.write(‘ELE,211,1,NO,Shower\n’)
f.write(‘NA,212,2,YES,NA\n’)
f.write(‘ELE,213,1,NA,Shower\n’)
f.write(‘ELE,NA,1,YES,NA\n’)
f.write(‘ELE,215,2,YES,Shower\n’)
f.write(‘NA,216,1,NA,Bathtub\n’)
f.write(‘NA,217,1,YES,NA\n’)
f.write(‘ELE,NA,NA,NO,Shower\n’)
f.write(‘NA,219,NA,YES,Bathtub\n’)
f.write(‘NA,220,1,YES,NA\n’)

data = pd.read_csv(data_file)

print(data)

#删除缺失值最多的列

to_drop = data.isna().sum().idxmax()

data = data.drop(columns=to_drop)

#print(data)

x, y, z = data.iloc[:, 0:2], data.iloc[:, 2], data.iloc[:, -1]

y = pd.get_dummies(y, dummy_na=True)
z = pd.get_dummies(z, dummy_na= True)

#print(x, y, z)

print(x)

print(y)

print(z)

#将预处理后的数据集转换为张量格式
a, b, c = torch.tensor(x.to_numpy(dtype = float)), torch.tensor(y.to_numpy(dtype = float)), torch.tensor(z.to_numpy(float))
#print(a, b, c)
print(a)
print(b)
print(c)
terminal得到:
tensor([[ nan, 1.],
[202., 2.],
[ nan, 2.],
[204., 1.],
[205., 2.],
[206., nan],
[ nan, 1.],
[208., nan],
[ nan, 1.],
[210., 1.],
[211., 1.],
[212., 2.],
[213., 1.],
[ nan, 1.],
[215., 2.],
[216., 1.],
[217., 1.],
[ nan, nan],
[219., nan],
[220., 1.]], dtype=torch.float64)
tensor([[0., 1., 0.],
[0., 0., 1.],
[1., 0., 0.],
[0., 0., 1.],
[1., 0., 0.],
[0., 1., 0.],
[0., 1., 0.],
[0., 0., 1.],
[1., 0., 0.],
[0., 1., 0.],
[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.],
[0., 1., 0.],
[0., 1., 0.],
[0., 0., 1.],
[0., 1., 0.],
[1., 0., 0.],
[0., 1., 0.],
[0., 1., 0.]], dtype=torch.float64)
tensor([[0., 1., 0.],
[0., 1., 0.],
[0., 0., 1.],
[0., 0., 1.],
[0., 1., 0.],
[1., 0., 0.],
[0., 0., 1.],
[0., 1., 0.],
[1., 0., 0.],
[0., 0., 1.],
[0., 1., 0.],
[0., 0., 1.],
[0., 1., 0.],
[0., 0., 1.],
[0., 1., 0.],
[1., 0., 0.],
[0., 0., 1.],
[0., 1., 0.],
[1., 0., 0.],
[0., 0., 1.]], dtype=torch.float64)

  1. 删除缺失值最多的列。
    #删除缺失值最多的列

to_drop = data.isna().sum().idxmax()
新建变量to_drop为data里面有NAN且求和sum后为最大值的列(因为isna().sum()默认为列)的id

data = data.drop(columns=to_drop)
新的data为drop to_drop后的矩阵

  1. 将预处理后的数据集转换为张量格式。

a = torch.tensor(data.to_numpy(dtype = float))

print(a)
若直接对初步处理后的data直接用torch.tensor(data.to_numpy(dtype = float))转换成浮点数,会发现报错,提示ValueError: could not convert string to float: ‘YES’。所以我想:把data含yes的部分通过
x, y, z = data.iloc[:, 0:2], data.iloc[:, 2], data.iloc[:, -1]
对data切割后用
y = pd.get_dummies(y, dummy_na=True)
z = pd.get_dummies(z, dummy_na= True)
进行布尔型的转换
最后成功转换成tensor的float:

a, b, c = torch.tensor(x.to_numpy(dtype = float)), torch.tensor(y.to_numpy(dtype = float)), torch.tensor(z.to_numpy(float))

但有可以改进之处:对于x本来属于浮点类型的列,我并未再进一步处理,对于房间号,可以按照顺序补全。对于床数,应该删除含有NAN的行。
——初学者rookie