前言

Python学了有一段时间了,最近可以开始做一些小需求。

需求说明

计算iris数据集的均值

使用iris数据集(iris.csv)。iris数据集中包含了3种鸢尾花的4个属性情况——花萼长度、花萼宽度、花瓣长度、花瓣宽度,现需要计算4个属性的均值,然后将均值情况存到my_iris.csv中。

实现思路及步骤

  1. 读取iris.csv文件,并储存为字典形式的数据。
  2. 计算每一个属性的均值。
  3. 把上述处理后的数据写入新建文件my_iris.csv,确保数据与属性保持一致。

这里图方便只写求一个均值。

代码解析

要实现这个需求,首先需要导入csv模块。

1
import csv

这是一个Python的内置模块,使用方法可以到网上查找使用文档。

定义常量,average用于存储均值,列表my_key用于存储csv表格头标题,old_filenew_file分别是需处理的文件和新生成的文件。

1
2
3
4
average = 0
my_key = []
old_file = 'C:\\Users\\12578\\Desktop\\iris.csv'
new_file = 'C:\\Users\\12578\\Desktop\\my_iris.csv'

接着用Python的with语句去打开需要处理的文件。

with语句适用于对资源进行访问的场合,确保不管使用过程中是否发生异常都会执行必要的“清理”操作,释放资源,比如文件使用后自动关闭、线程中锁的自动获取和释放等。

with语句的好处就是不需要用tryfinally去异常处理,简洁了代码。

使用open()方法的r(只读)模式打开old_file,使用csv模块的DictReader()方法,以字典形式读取。
列表column用于存储for循环匹配列的元素。
<=range(len(column))(小于或等于column列表的长度)条件下进行循环,计算均值,存入average中。

1
2
3
4
5
with open(old_file,'r') as f:
reader = csv.DictReader(f)
column = [iris_item['Sepal.Length'] for iris_item in reader]
for i in range(len(column)):
average += (float(column[i]) / len(column))

定义my_data列表用于存储均值数据。把表头也追加到my_key列表中。

1
2
my_data = [average]
my_key.append('Sepal.Length')

使用open()方法的w(打开一个文件只用于写入)模式打开new_file
DictWriter()方法把列表my_key的表头数据以字典形式写入,writeheader()方法写入表头。
再把列表my_datawriterow()方法单行写入(writerows()是多行写入)。

1
2
3
4
5
with open(new_file, 'w', newline = '') as k:
write_csv = csv.DictWriter(k, my_key)
write_csv.writeheader()
write_csv2 = csv.writer(k)
write_csv2.writerow(my_data)

结果展示

数据处理好了!
my_iris.csv

这里有人会问了,为什么有这么多位小数?
经过查找资料:(引用来源:https://www.cnblogs.com/lsdb/p/10600815.html)

二进制对很多浮点数无法准确表示只能用一个近似值代替,而当使用这些以近似值代替的浮点数进行进算时本质上是这些进似值参与了运算,出来的结果也就是进似值运算后的结果。
也就是说,一是这不是乘100的问题也不是乘法的问题而是整个浮点数运算都有问题,二是这不是python的问题是计算机浮点数存储的问题像C、Java等其他计算机语言进行运算都会有问题。

有兴趣可以自己动手试试,附iris.csv文件下载链接:http://kksanblogdoc.test.upcdn.net/doc/iris.csv

后记

excel求均值函数不香吗?u1s1,确实。
但只是这个需求太小体现不出Python的便利性,有一天需求很大很复杂的时候,Python或许可以帮你省点力。