python中的第3方工具包pandas功能强大,
日常工作中比如筛选、排序、计算、透视、vlookup、分类汇总等excel常用操作用pandas也能轻松实现;
本文精心整理的pandas数据处理与分析的52个技巧, 100多个知识点, 掌握这些,处理数据不再是难事!
导入工具包
# pandas 和numpy是两个基础的工具包 import numpy as np import pandas as pd # matplotlib seaborn是作图工具包 import matplotlib.pyplot as plt import seaborn as sns # 通过os设置默认路径 import os os.chdir('C:/Users/用户/Desktop/') # 桌面的路径 # 图表中文显示问题 plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签 plt.rcParams['axes.unicode_minus']=False #用来正常显示负号 # 不显示预警 import warnings warnings.filterwarnings('ignore')
读取excel数据
# 读取文件 df = pd.read_excel('文件.xlsx') # 读取文件同时筛选需要的列 df = pd.read_excel('文件.xlsx')[['','']] # 读取并筛选几列 # 读取特定的工作表 df = pd.read_excel('文件.xlsx',sheet_name='明细') # 读取某个sheet表 # with方法读取 with pd.ExcelFile('path_to_file.xls') as xls: df1 = pd.read_excel(xls, 'Sheet1') df2 = pd.read_excel(xls, 'Sheet2')
读取csv或者txt
# 分隔符: \s 表示空白字符; \s+多个空白字符; \r回车; \n换行; \t水平制表符; \v垂直制表符 df = pd.read_csv('文件.txt',sep='\s+',error_bad_lines=False)
批量读取同一文件夹下文件方式1
for root, dirs, files in os.walk('.',topdown=False): print(files) num = len(files) # 获取文件个数 data = pd.DataFrame() # 定义一个空的dataframe # 遍历所有文件 for i in range(num): datai = pd.read_excel('./%s' %files[i]) datai_len = len(datai) data = data.append(datai) # 添加到总的数据中 print('文件%i列, 第%i个表,读取%i行数据,名称:%s'%(len(data.columns),i,datai_len,files[i])) # 查看是否全部读取,格式是否出错 data.reset_index(drop=True,inplace=True)
批量读取同一文件夹下的文件方式2
# 导入工具包 import pandas as pd import numpy as np import os # 路径 path = 'd:/文件路径/' # 文件列表 files = [] for file in os.listdir(path): if file.endswith(".csv"): files.append(path+file) # 定义一个空的dataframe data = pd.DataFrame() # 遍历所有文件 for file in files: datai = pd.read_csv(file,encoding='gbk') datai_len = len(datai) data = data.append(datai) # 添加到总的数据中 print('读取%i行数据,合并后文件%i列, 名称:%s'%(datai_len,len(data.columns),file.split('/')[-1])) # 查看是否全部读取,格式是否出错 # 重置索引 data.reset_index(drop=True,inplace=True)
批量读取同一文件夹下得文件方式3(当txt文件不规范,读取会丢失数据或文件太大时)
# 循环读取数据 n = 1 for file in files: with open(file, 'r',encoding='gbk') as f_input: lisi= [] for line in f_input: lisi.append(list(line.strip().split('|'))) datai = pd.DataFrame(lisi) datai2 = guolv(datai) data = data.append(datai2) print('读取第%i个文件,件名%s,文件%i行,文%i列.处理后文件%i行,%i列' %(n,file,datai.shape[0],datai.shape[1],datai2.shape[0],datai2.shape[1])) n = n + 1
文件导出,放在同一工作簿
writer = pd.ExcelWriter('文件.xlsx') for name , group in df.groupby('名称'): group.to_excel(writer,sheet_name=name,index=False)
文件导出, 分组导出放在同一工作簿
writer = pd.ExcelWriter('文件.xlsx') for name , group in df.groupby('名称'): group.to_excel(writer,sheet_name=name,index=False)
文件导出, 分组导出, 放在不同工作簿
for name , group in df.groupby('名称'): group.to_excel(name+'.xlsx',index=False)
获取当前时间
import time tim = time.strftime("%Y-%m-%d%H%M%S", time.localtime())
保存图片分辨率设置
plt.savefig('名称.png',dpi=150)
数据查看
df.describe() # 描述统计 df.info() # 基本信息 df.dtypes # 列格式类型 df.head(2) #前n行 df.tail(2) #后n行 df.shape #维度 df.index #索引 df.columns #列名 df.sample(10) #随机抽样 df.resample() #随机抽样
行列处理(删除,排序)
# 删除列 del df['变量名'] df.drop('变量名',axis=1,inplace=True) # 删除行 df.drop('c') # 更改列名 df.columns= ['var1','var2','var3'] # 列名的个数 = 字段个数 df.rename(columns = {'名称前':'名称后'},inplace=True) # columns 不能少 # series中改列名 s.rename('名称',inplace=True) # 调整列的顺序 df1 = df1[['var1','var2','var3']] # 调整行的顺序 df2 = df1.reindex(['a','b','c','d','e']) # 返回一个新的DataFrame,按新的索引进行排序
缺失值(查看,替换,计数)
# 判断是否是缺失值 df.isnull() #不能省略括号 df.notnull() # 计算缺失值个数 s.isnull().value_counts() # 每列缺失值个数 df.isna().sum() # 缺失值个数 # 填充缺失值 df['A'].fillna('缺失数据',inplace=True) data1.fillna(method='pad') # 类似于excel中用上一个单元格内容批量填充 # 删除指定列包含缺失值的行 data.dropna(subset=["C"],inplace=True) # []不能少 data.dropna(how="all") # 删除全为空的行 data.dropna(thresh=2) #删除有效数据小于2的数据 # 缺失值个数并排序 df.isnull().sum().sort_values(ascending=False).head()
重复值(查看,删除)
# 不重复项 df['A'].unique() df['A'].nunique() #查看不重复值个数 df['A'].unique().tolist() # 转list df['A'].value_counts() # 计数 # 去重 set(data2['名称']) # 查看重复项,返回True False df.duplicated() # 查看重复的数据 data4 = data3[data3.duplicated(subset='var1',keep=False)] # 删除重复项 df.drop_duplicates(['var'],inplace=True) # 按两列去重 data.drop_duplicates(subset=['A','B'],keep='first',inplace=True) # 分组计算不重复项个数 result = df.groupby(['var1','var2']).agg({'var3':'nunique','var4':['min','max']})
修改格式(格式转换, 百分比, 格式判断)
# 改变列的格式(文本型数值改成数值型数值) df['var1'] = df['var1'].astype('int') # errors = 'ignore' df['var1'] = df['var1'].astype(np.float) # 多列转换 df[['user_id','merchant_id','coupon_id']]=df[['user_id','merchant_id','coupon_id']].astype(str) df.infer_objects() # 根据数据特征自动转换 # 百分比格式 data['B_per%'] = data['B_per'].apply(lambda x: '%.2f%%' % (x*100)) # 判断格式,是否为字符串 data['var'].apply(lambda x:isinstance(x,str))