错误现象
使用pandas读取西瓜分类的csv数据
data_raw = pd.read_csv(r'./data/watermelonf.csv', encoding='GB18030')
print(data_raw)
得到结果:
色泽 根蒂 敲声 纹理 脐部 触感 好瓜
0 青绿 蜷缩 浊响 清晰 凹陷 硬滑 是
1 乌黑 蜷缩 沉闷 清晰 凹陷 硬滑 是
2 乌黑 蜷缩 浊响 清晰 凹陷 硬滑 是
3 青绿 蜷缩 沉闷 清晰 凹陷 硬滑 是
4 浅白 蜷缩 浊响 清晰 凹陷 硬滑 是
5 青绿 稍蜷 浊响 清晰 稍凹 软粘 是
6 乌黑 稍蜷 浊响 稍糊 稍凹 软粘 是
7 乌黑 稍蜷 浊响 清晰 稍凹 硬滑 是
8 乌黑 稍蜷 沉闷 稍糊 稍凹 硬滑 否
9 青绿 硬挺 清脆 清晰 平坦 软粘 否
10 浅白 硬挺 清脆 模糊 平坦 硬滑 否
11 浅白 蜷缩 浊响 模糊 平坦 软粘 否
12 青绿 稍蜷 浊响 稍糊 凹陷 硬滑 否
13 浅白 稍蜷 沉闷 稍糊 凹陷 硬滑 否
14 乌黑 稍蜷 浊响 清晰 稍凹 软粘 否
15 浅白 蜷缩 浊响 模糊 平坦 硬滑 否
16 青绿 蜷缩 浊响 稍糊 稍凹 硬滑 否
17 青绿 稍蜷 浊响 稍糊 平坦 硬滑 否
下面使用iloc()读取数据的第3行,去掉好瓜那一列,print出来
print(data_raw.iloc[3, :-1])
得到的结果有点奇怪
色泽 青绿
根蒂 蜷缩
敲声 沉闷
纹理 清晰
脐部 凹陷
触感 硬滑
Name: 3, dtype: object
按道理来说应该是这样
色泽 根蒂 敲声 纹理 脐部 触感
3 青绿 蜷缩 沉闷 清晰 凹陷 硬滑
找昏头,才想起来用type查看这两个结果的类型,结果如下:
<class 'pandas.core.series.Series'>
<class 'pandas.core.frame.DataFrame'>
正确解决方法
建议查看pandas官方教程
当iloc函数中传入的两个索引的类型都是列表的时候,得到的结果类型就是DataFrame;
# 例如
print(type(data_raw.iloc[3, :-1]))
print(type(data_raw.iloc[[3], :-1]))
print(type(data_raw.iloc[1:3, :-1]))
print(type(data_raw.iloc[[1, 3], :-1]))
# 除了第一个的类型是Series,下面三个都是DataFrame。
当传入的索引有一个是int,另一个是列表时,得到Series类型;
# 例如:
b = data_raw.iloc[[3], 1]
print(type(b))
b = data_raw.iloc[3, [1]]
print(type(b))
b = data_raw.iloc[[3], 1]
print(type(b))
# 得到的结果均为<class 'pandas.core.series.Series'>
当传入两个int类型时,得到一个确切的元素,类型即该元素的类型。
# 例如
c = data_raw.iloc[3, 1]
print(c, type(c))
# 得到: 蜷缩 <class 'str'>
trans_to_num(data_raw)
# 这个函数的作用是把里面的文字改为数字
c = data_raw.iloc[3, 1]
print(c, type(c))
# 得到: 2 <class 'numpy.int64'>
错误解决方法
曾经在不知所措的时候使用pandas.DataFrame函数,将Series数据类型转换为DataFrame。
a = pd.DataFrame(data_raw.iloc[3, :-1])
print(type(a))
print(a)
print("转换后的数据形状:", a.shape)
得到的类型也确实是
<class 'pandas.core.frame.DataFrame'>
但是维度不匹配,原来得到的数据是这样的
3
色泽 青绿
根蒂 蜷缩
敲声 沉闷
纹理 清晰
脐部 凹陷
触感 硬滑
转换后的数据形状: (6, 1)
原来是直接按照原来的格式转换过去。
经验总结
多看官方文档!!!