作为python新手,记一次用python处理数据的经历,写作目的仅为自己不要忘记。
1. 数据介绍
通过微信小程序“报名工具”,设计了3个信息字段和10个问题,发放到各个城市的影迷群,共收集403条数据,数据不多,拿来试手还可以
2. Python读写Excel
python操作excel主要用到xlrd和xlwt这两个库,即xlrd是读excel,xlwt是写excel的库。https://pypi.python.org/pypi,使用方式参见另一篇文章:[python]使用xlrd对Excel表格进行读写操作,python使用xlwt模块操作Excel
2.1 导入模块
import xlrd import xlwt from collections import Counter
2.2 定义读数据函数
def read_excel(): # 打开文件 workbook = xlrd.open_workbook(r'C:\Users\Pan\Desktop\淘票票奥斯卡有奖竞猜.xls') # 根据sheet索引或者名称获得sheet内容 sheet1 = workbook.sheet_by_index(0) # sheet的名称,行数,列数 nrows = sheet1.nrows data = [] for i in range(1, nrows): data.append(sheet1.row_values(i)) return data
3. 统计数据
3.1 统计每个问题选择最多的选项
Python中统计列表中重复出现项的个数有很多方法,可参见博文:Python统计列表中的重复项出现的次数,这里选择使用collections 库的 Counter方法。当然,还可以使用博文中没有提及的numpy库的unique方法,参见:numpy.unique。在read_excel() 中添加代码:
# 全局统计每一项最多的选择
for i in range(4, ncols - 1): # 去掉无关项
print(Counter(sheet1.col_values(i)).most_common(1))
3.2 统计每个城市的正确情况并写入Excel
【参数】lst:所有数据集;city_list:城市列表;result:最终正确的答案
def city_result(lst, city_list, result): # 计算城市的正确率 workbook = xlwt.Workbook(encoding='utf-8') for i in range(len(city_list)): city_name = city_list[i] city_data = list(filter(lambda x: x[3] == city_name, lst)) for j in range(len(city_data)): correct = 0 for k in range(4, len(city_data[j]) - 1): # 字符串查找 if city_data[j][k].find(result[k-4]) >= 0: correct += 1 city_data[j].append(correct) # 按照最后一行降序排列 sort_data = sorted(city_data, key=lambda ls: ls[len(city_data[0])-1], reverse=True) # 写入excel worksheet = workbook.add_sheet(city_name) for i in range(len(sort_data)): for j in range(len(sort_data[i])): worksheet.write(i, j, label=sort_data[i][j]) workbook.save(r'C:\Users\Panjf\Desktop\淘票票奥斯卡有奖竞猜结果.xls')
【注意点】
1. python中字符串查找可以使用index() 和find()方法。使用index(),如果匹配失败,会抛出异常:ValueError:substring not found,如果用find()方法代替,匹配失败返回false,匹配成功返回匹配开始的索引;
2. python numpy数组的排列方式有许多种,参见:python 列表排序方法sort、sorted技巧;
3. 关于Numpy数组需要注意:同一个Numpy数组中所有元素的类型必须是相同的。通过numpy.array(list)的方式创建数组,如果list中既含有字符串又含有数值类型,转变成数组后,类型都是字符串