背景:
最近指导老师布置了一个数据分析的任务要将三张表格进行整理 得到错题的数目
页行列表示错题的位置
思路:
我的思路是读取文件夹当中的文件名列表,然后利用for循环和pandas逐一读取每个文件。接下来是对文件的操作:1.逐列将每个单元格的数据拆分成单独的列
2.将拆分的列数据合并为一个整体的df对象
3.将文件夹当中的文件重复上述操作,最后将其合并为一个df对象
4.进行分组聚合操作 得到最后的结果
实操:
这里将重要的几个操作记录一下
1.利用os.listdir 返回得到文件夹当中的文件名 返回的是一个列表
wenjianliebiao=os.listdir(r'E:/数据处理/')
2.拆分为多行数据并合成
df_list=[]
data 为df对象
lieming=list(data) #返回df对象的列名列表
for i in lieming:
df_2 = data[i].str.split('\n', expand=True).stack().reset_index(level=1, drop=True).rename(i) #将单元格数据进行拆分成多行数据
df_3=pd.DataFrame({i:df_2})
df_list.append(df_3)
df_merge=pd.concat(df_list)
核心代码:df_2 = data[i].str.split('\n', expand=True).stack().reset_index(level=1, drop=True).rename(i) #将单元格数据进行拆分成多行数据
将每一列的数据单独进行拆分
data[i] 列当中的数据
str 先将数据强制转换为字符串
split 以\n为间隔符进行切割 expand=True表示是否将数据类型转换为df
stack()即“堆叠”,作用是将列旋转到行 这一步操作让所有的数据翻转成行
reset_index(level=1, drop=True) 设置行索引 让翻转过后的数据对应相应的索引
rename(i) 设置对象的名称 偏于后续的df对象合成 这里的名称相当于列名
到这里 已经拆分好数据了 接下来是将拆分的数据合成
由于数据类型为serise对象 所以将其转变为df对象进行合成
df_3=pd.DataFrame({i:df_2}) i列名 df_2已经完成分解操作的对象
df_list.append(df_3) 将df对象添加到一个空列表当中
df_merge=pd.concat(df_list) 利用pd.concat合成数据
最终结果:
代码
import pandas as pd
import os
wenjianliebiao=os.listdir(r'E:/数据处理/')
df_listzong=[]
for wenjianname in wenjianliebiao:
df_list=[]
data=pd.read_excel(f'E:/数据处理/{wenjianname}',index_col=0) #读取数据 并指定对象的行索引为第一行
lieming=list(data) #获取列名列表
hangming=data._stat_axis.values.tolist() #获取行索引列表
for i in lieming:
df_2 = data[i].str.split('\n', expand=True).stack().reset_index(level=1, drop=True).rename(i) #将单元格数据进行拆分成多行数据
df_3=pd.DataFrame({i:df_2})
df_list.append(df_3)
df_merge=pd.concat(df_list)
df_merge.reindex(columns=lieming)
df_listzong.append(df_merge)
df_mergezong=pd.concat(df_listzong)
df_mergezong.to_excel(r'E:/数据处理/合成数据.xlsx')
df_duqu=pd.read_excel(r'E:/数据处理/合成数据.xlsx')
#更改第一列索引
df_duqu=df_duqu.rename(columns={'Unnamed: 0':'错误类型'})
#根据错误类型进行分组
df_juhe=df_duqu.groupby('错误类型')
#对分组后的数据进行聚合 得到每种错误类型的错误数量
jieguo=df_juhe.agg('count')
jieguo.to_excel(r'E:/数据处理/结果统计.xlsx')
print(jieguo)
结果展示