数据预处理

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

这个代码块好像有两处错误,第一行的代码格式应该不对拆成两行可以在py上运行,然后第二行会报错字符串不能求均值改成了
inputs.iloc[:,0] = inputs.iloc[:,0].fillna(inputs.iloc[:,0].mean())
本人大学生转码新手如有误解请大佬指正 :grinning:

不对吧,[0:2]是第1列和第2列的意思

为什么我的张量是这个样子,是正常的吗

我也是这个问题,还没有解决,看样子应该是不能将字符和数字一起进行平均

解决了,粘贴别人的回答:inputs.mean() 更改为 inputs.mean(numeric_only=True)
表示仅处理数字部分,否则程序异常

第一题:
思路就是遍历每一列,统计NaN的数量,超过记录的最大值就更新记录,最后从dataframe中移除找到的NaN最多的列。注意这里取dataframe的头可以用dataframe.columns.to_list(),获得的是一个数组。

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')

row_count = len(data)
max_nan = 0
target_col_name = ""
for col_name in data.columns.to_list():
    cnt = data[col_name].count()
    if row_count - cnt > max_nan:
        max_nan = row_count - cnt
        target_col_name = col_name
data.drop(target_col_name, axis=1, inplace=True)
data

第二题:
思路就是先用插值法消除NaN的单元数据,再把dataframe转为numpy数组,再转torch.tensor。

import torch

data = data.fillna(data.mean())
data

# 转浮点数tensor
X = torch.tensor(data.to_numpy(dtype=float))
X

# 转整型tensor
Y = torch.tensor(data.to_numpy(dtype=int))
Y

Alley那一列有Pave,NaN求平均值mean不会报错吗

numeric_columns = inputs.select_dtypes(include=['number'])    #选择数值列
inputs[numeric_columns.columns] = inputs[numeric_columns.columns].fillna(numeric_columns.mean())

计算每列的缺失值数量

missing_values = data.isnull().sum()

找到缺失值最多的列

column_with_most_missing_values = missing_values.idxmax()

删除缺失值最多的列

data_without_most_missing_column = data.drop(column_with_most_missing_values, axis=1)

打印结果

print(“删除缺失值最多的列后的数据集:”)

print(data_without_most_missing_column.head())

NumRooms Alley_Pave Alley_nan
0 3.0 True False
1 2.0 False True
2 4.0 False True
3 3.0 False True
为什么我输出的不是0和1,而是True and False

+++++++++++++++++1,我也是这样,可能和版本有关系?

number = #空列表
names = [‘NumRooms’,‘Alley’,‘Price’]
for name in names:
a = data[name].isnull().sum() #isnull识别缺失值,sum计算总数
number.append(a)
max_index = number.index(max(number)) # 使用Python内置函数max()和list.index(),找到缺失值最多的行的index
data = data.drop(names[max_index], axis=1) #使用drop,axis=1表示操作列
print(data)

thresh参数值设定的是非NaN值的阈值,你这样写有问题哎

我在运行这一段```
inputs, outputs = data.iloc[:, 0:2], data.iloc[:, 2]
inputs = inputs.fillna(inputs.mean())
print(inputs)

结果报错:

TypeError: can only concatenate str (not “int”) to str

貌似我的pandas没法处理NumRooms的数值类型,Alley的字符串类型,他们无法平均,所以我把这两列分开处理了

你看看对应英文版,其实,应该在fillna()之前,先get_dummy(),把字符串类型变成数字

第二章数据预处理中报错: can only concatenate str (not “int”) to str
报错原因:
panda新版本对fillna函数做了调整,原先是忽略str。
解决方法:
将原代码:
inputs = inputs.fillna(inputs.mean())
修改为:
inputs = inputs.fillna(inputs.mean(numeric_only=True))

1 Like

#下面是练习
import os
import pandas as pd
import torch

os.makedirs(os.path.join(‘…’,‘data’),exist_ok=True)
data_file = os.path.join(‘…’,‘data’,‘test.csv’)
with open(data_file, ‘w’) as f:
f.write(‘Animals,Numbers,Heights,Weights,Ages,Features\n’) # 动物们,总数量,平均高度,平均体重,平均年龄,大小特征
f.write(‘Tigers,4,85.5,68.2,6.4,Big\n’) # 每行表示一个数据样本
f.write(‘Cats,2,NA,7.3,6.5,Small\n’)
f.write(‘Lions,NA,106,74.8,NA,Big\n’)
f.write(‘Dogs,12,62.7,25.8,5.4,Small\n’)
f.write(‘Panda,1,NA,46,9.9,NA\n’)
f.write(‘Cattles,8,143.2,NA,12.5,Big\n’)
data = pd.read_csv(data_file)
print(data)
data = pd.get_dummies(data,columns=[‘Features’],dummy_na=True)

sum_na = data.isna().sum()
column_drop = sum_na.index[sum_na.argmax()]
data = data.drop(columns = column_drop)
print(data)

outpus = data.iloc[:,1:]
outpus = torch.tensor(outpus.to_numpy(dtype=float))

outpus = torch.tensor(outpus.values,dtype=torch.float32)

print(outpus)

附上我的jupyter代码

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

nan_counts = data.isna().sum()
data.isna(), nan_counts, type(nan_counts)

most_na_col_name = nan_counts.idxmax()
most_na_col_name, type(most_na_col_name)

data_dropped = data.drop(columns=most_na_col_name)
data_dropped

# homework 2
# before = id(data_dropped)
# # data_dropped = data_dropped.fillna(data_dropped.mean(numeric_only=True))
data_dropped[:] = data_dropped.fillna(data_dropped.mean(numeric_only=True))
# after = id(data_dropped)
# print(f"before == after? : {before == after}")
data_dropped = pd.get_dummies(data_dropped, dummy_na=True)
data_dropped

data_dropped_tensor = torch.tensor(data_dropped.to_numpy(dtype=float))
data_dropped_tensor

设定计数器和最大值

count = 0
max = 0

按列计数并找到最大NAN数量列,让name保存这个列名

for column in file.columns:
count = file[column].isna().sum()
if count > max:
max = count
name = column
print(‘The most NAN column name is’, name, ‘and it has been deleted’)

删掉name列并覆盖文件

file.drop(name, axis=1, inplace=True)
file.to_csv(data_file, index=False)
print(file)

转换张量数据并打印

x = torch.tensor(file.to_numpy(dtype=float))
np.set_printoptions(suppress=True)
print(x,‘\n’,x.numpy())

确实,我在本地跑也是这个问题。不过我选择调换语句顺序,先把类别抽出来:
inputs = pd.get_dummies(inputs, dummy_na=True)
print(inputs)
然后再:
inputs = inputs.fillna(inputs.mean())
print(inputs)
就可以在不改变调用函数的情况下运行