【自学日记】用python pandas库实现excel数据处理

注:本人土木自学转码菜鸟一枚,文中代码仅做个人学习记录,欢迎大家提出更好的代码,一起学习,加油!

核心目的:对数据进行多层分类筛选之后对满足条件的重复值依次进行编号

问题背景:(比较复杂希望我自己能解释清楚)

对象是在读博士,做问卷调研回收了3000多份问卷,研究教师之间的知识交流。回收上来的数据需要进行清洗,具体方法如下图,excel每行是一个人填写的问卷,列teamid为同一数字的可以认为这几个人是在同一个办公室里面,但是一个办公室的老师是分布在不同的年级(1~12年级,对应小学-初中),现在要求进行数据清洗,只有在同一个办公室、同一个年级的老师人数≥3的数据,才是我们要分析的对象。如果同一个办公室出现了≥3位老师是同一年级的话,就从1开始在I列进行编号(这几位老师编号是一样的),否则,编号为0。之后会把编号为0的数据清洗掉,从而达到数据清洗的目的。

【自学日记】用python pandas库实现excel数据处理_第1张图片

问题的本质和难点:对一列(teamid)分类筛选之后,再进行分类筛选(grade),并选出重复值≥3个的记录,而且要自动在每一个重复值后面加上编号。(注:excel数据透视表本身能看到每组有哪些数据是重复超过3次的,但是并没有找到对重复值按顺序赋值的方式,3000多条数据只能手动打字),所以决定使用python pandas库进行,经过自学2天pandas后代码如下:

import os
import pandas as pd
# 文件存在桌面上,先定位到桌面
os.chdir('C:\\Users\\yourusername\\Desktop')
# pandsa打开数据文档
df=pd.read_excel('test.xlsx')
# 先按照teamid分类筛选,再在此基础上按照Grade分类筛选
grouped_df=df.groupby('teamid')
temp_df=grouped_df['Grade']
# 对于经过两次分类筛选后的结果进行计数,并放到字典中,
count=temp_df.value_counts()
count_dict=dict(count)
num_dict={} #用一个空字典来承接groupid的数值记录
# 如果count_dict字典的值≥3就从1开始标记,如果不是,就标记为0
i=1
for key, value in count_dict.items():
    if value<3:
        num_dict[key]=0
    else:
        num_dict[key]=i
        i+=1
# 原excel的数据转换为字符串,方便下一步处理
df['teamid']=df['teamid'].astype('str')
df['Grade']=df['Grade'].astype('str')
# 做一个辅助列tuple_id, 把两个数值“拼”成一个元组存入辅助列,例如‘(1,1)’代表teamid=1且grade=1的数据,这个数据可以有1个也可以有多个,这样重复的值就可以根据这个坐标来赋同样的值了
df.loc[:,'tuple_id']='('+df['teamid']+','+df['Grade']+')'
#搞一个函数,遍历excel中的数据,然后处理
def create_groupid(df):
    groupid=[] #列表用来存放值
    for i,row in df.iterrows():
        if num_dict[eval(row['tuple_id'])]==0: #如果这一行辅助列tuple_id中的坐标传入字典中查询到的值为0(也就是不人数没有超过3个人)
            groupid.append(0) #列表填上值0
        else:
            groupid.append(num_dict[eval(row['tuple_id'])]) #如果人数(重复值)超过三个了,那就把这个小组的编号放到列表中
    return groupid

#调用函数,把create_groupid返回的列表添加到新创建的列groupid中
df['groupid']=create_groupid(df)
#把输出的dataframe结果写入excel,完成!
writer=pd.ExcelWriter('testnew.xlsx')
data=df
data.to_excel(writer)
writer.save()

输出结果:

【自学日记】用python pandas库实现excel数据处理_第2张图片

总结和反思:

作为一个自学新手,前期没有理顺程序逻辑确实走了很多弯路,查了很多资料后才逐渐清晰解决方式:本质是我们要有一个查询字典(num_dict,以(teamid,grade)为键,以groupid为值),然后再遍历dataframe中的每一行(每一行以tuple_id为标签),然后用这个标签去查找字典中应该赋什么值。这样就实现了两层分类筛选之后对重复值依次进行编号的目的,同理,如果有N层分类筛选重复值并赋值的需求,该方法同样适用。

欢迎各路大神批评指正,您的建议是我进步的最大源泉。

你可能感兴趣的:(pandas,python)