使用pandas代替excel做数据分析的总结
本人python菜鸟一枚,初学python后喜欢使用python代替excel处理数据,主要是由于平时处理的数据量比较大,而excel光把数据文件打开就要很久很久;由于使用excel多年,对于excel的数据分析比较了解,所以遇到问题首先会想用excel是怎么处理的,然后再想用pandas如何实现;网上对于如何使用pandas代替excel这一方面的介绍都比较零散,所以只能自己一遍摸索,一遍总结,后续将该部分内容逐一补充:
文章目录
导入模块和读取文件
导入模块
import pandas as pd#数据分析模块
import numpy as np#数字处理模块
import os#文件夹模块
利用OS库进行文件夹操作
import os
path="c:\\xx\\xx"
os.chdir(path)#改变当前目录
os.getcwd()#显示当前目录
os.listdir()#显示当前目录的文件
os.path.dirname(os.getcwd())#获取上级目录
读取excel文件
df=pd.read_excel(io, sheet_name=0, header=0, names=None, index_col=None, usecols=None, squeeze=False, dtype=None, engine=None, converters=None, true_values=None, false_values=None, skiprows=None, nrows=None, na_values=None, parse_dates=False, date_parser=None, thousands=None, comment=None, skipfooter=0, convert_float=True, **kwds)
该命令的参数其实是很多的,大部分都是不需要输入的,其中有几个比较常用的参数:
io
也就是文件所在的地址,必输项。
sheet_name
是excel中的sheet,可以输名称或者数字,数字代表是第几张sheet,默认是第一张,如果excel文件只有一张sheet,可以不输。
header=1
或者skiprows=1
:当文件的第一行不是标题行的时候,使用该参数,数字代表跳过几行,默认是0代表不跳过。
index_col='xx'
自定义索引列的时候使用该参数,默认是空值,由pandas自建索引列。
举个例子:
df=pd.read_excel('c:\\xx\\xx.xlsx',sheet_name='Sheet1')#一般来说这样就可以了
读取csv文件
df=pd.read_csv(filepath_or_buffer, sep=‘,’, delimiter=None, header=‘infer’, names=None, index_col=None, usecols=None, squeeze=False, prefix=None, mangle_dupe_cols=True, dtype=None, engine=None, converters=None, true_values=None, false_values=None, skipinitialspace=False, skiprows=None, nrows=None, na_values=None, keep_default_na=True, na_filter=True, verbose=False, skip_blank_lines=True, parse_dates=False, infer_datetime_format=False, keep_date_col=False, date_parser=None, dayfirst=False, iterator=False, chunksize=None, compression=‘infer’, thousands=None, decimal=b’.‘, lineterminator=None, quotechar=’"', quoting=0, escapechar=None, comment=None, encoding=None, dialect=None, tupleize_cols=None, error_bad_lines=True, warn_bad_lines=True, skipfooter=0, doublequote=True, delim_whitespace=False, low_memory=True, memory_map=False, float_precision=None)
举个例子:
f=open('c:\\xx\\xx.csv')
df=pd.read_csv(f,encoding='gb18030')
csv文件读取最好使用该模式,这里有两个地方需要注意,一是read_csv
命令无法直接识别中文目录,需要先通过open
命令打开文件,再使用read_csv
命令;二是csv的中文有可能是'gbk'
编码的,所以使用encoding
参数,如果报错,则试试将该参数删除,或者改成'utf8'
等其他编码。
最新发现gbk
经常报错,'gbk' codec can't encode character '\xa0'
,原因是文件里有空格,建议使用gb18030
编码。
如果出现astype(float)
报错,看一下有没有空白行,删掉drop(df[df['xx']==''].index)
sheet汇总
读取excel中所有sheet汇总到一张sheet
dfs=pd.read_excel('xxx.xlsx',sheet_name=None,index_col=0)
#sheet_name=None就是读取所有sheet的意思
df=pd.concat(dfs)
最近发现了另外一个sheet汇总的方式,适合部分sheet汇总。
df = pd.ExcelFile('xxx.xlsx')
dfs = pd.concat([
df.parse('sheet1'),
df.parse('sheet2'),
df.parse('sheet3')
])
选取某行某列
df=df[['xx','yy']]
#之前一直没想出来怎么选取最后几列,后来终于想出来了
df=df[df.columns[-3:]]
df.irow(xx)#第几行
df.icol(xx)#第几列
df.iat[xx,xx]#第几行第几列
数据处理
排序
df.sort_values(by='xx')#正序
df.sort_values(by=('xx','xx'))#排序是可以对多个列进行排序的
df.sort_values(by=('xx','xx'),ascending=False)#倒序
筛选
df=df[df['名称'].isin(['全名1','全名2','全名3'])]
df=df[df.名称.str.contains('简称1') == True]
df=df[df.名称.str.contains('简称1') == False]
df=df.query("xx='y1'")
df=df.query("xx==['y1','y2']")
筛选的方式有多种
时间序列
df['xx']=pd.to_datetime(df['xx'])
df.index=pd.to_datetime(df.index)
时间序列格式调整
df["xx"] = df["xx"].astype("datetime64[ns]").dt.date
重命名
df.rename(index=str,columns=dict)
df.columns=df.columns.map(lambda x:x+'text')
df=df.rename(index={'a及b':'a和b'})
转换数据类型
df['xx']=df['xx'].astype(float)
df['xx']=df['xx'].astype(str)
删除
df.drop('索引值',axis=0,inplace=True)
df=df.drop(df.query("xx.str.contains('yy') == True").index)
df=df.drop(df[df['xx'].isin(['x1','x2','x3'])].index)
df=df.dropna(['xx'])
df=df[df['xx'].dropna()]
删除包含中英文的行
df = df[
~df["xx"]
.astype(str)
.apply(lambda x: bool(re.search("[\u4e00-\u9fa5a-zA-Z]", x)))
]
固定顺序
list1=['x1','x2','x3']
df['xx']=df['xx'].astype('category')
df['xx'].cat.reorder_categories(list1,inplace=True)
模糊匹配
for index,row in df.iterrows():
if row['xx'].find('yy')>0:
df.drop(index,axis=0,inplace=True)
df.xx.astype(str).str.contains('xx')
df.xx.astype(str).str.endswith('xx')
df.xx.astype(str).str.startswith('xx')
df.xx.astype(str).str.get()#获取指定位置的字符串
df.xx.astype(str).str.strip()#去除空白字符
替换
str.replace(r'[^0-9]','')#去除非数字
str.lstrip('0')#去掉开头的0
df['xx']=df['xx'].replace(np.nan,df['yy'])#用另一列的数据替换缺失值
df1['余额折人民币']=df1['余额折人民币'].str.replace(',','').astype(float)
df.loc[df['xx']*0.77372>df['yy'],'zz']=0
去重
df=df.drop_duplicates(['xx'])
切片
split()
字符串变成变量
locals()[i]
for i in x:
locals()[i]=xxx
变量变成字符串
''.join
'.*?'.join('xx')
空值
isnull()
notnull()
iterrows
for row_index, row in df.iterrows():
百分比
'%.2f%%' % (xx*100)
四舍五入
round(xx,2)
df['xx']=df['xx'].round(decimals=2)
求和
df['列合计']=df.apply(lambda x:x.sum())
df.loc['行合计']=df.apply(lambda x:x.sum())
加一行
df.loc['new']=df.loc['xx']-df.loc['yy']
显示股价走势
#比较一下几种股票的情况。规范起点为100
(df/df.ix[0]*100).plot(figsize = (8,4))
returns =np.log(df / df.shift(1))
增速
tb2=pd.concat([tb2,tb2/tb2.shift(1)-1],axis=1)
数组转字典
d=['a','b','c']
dict1={}
for i in d:
dict1[i[0]]='d'
数据透视
使用Python进行数据透视有两种方式,一种是使用pandas自带的数据透视表功能pivot_table,另一种是使用groupby汇总功能,两种功能各有优劣,如果是简单的数据汇总,建议使用groupby功能。
数据透视表
tb=pd.pivot_table(data,values=['x1'],index=['x2'],columns=['x3'],aggfunc='sum',fill_value=0,margins=False,dropna=False,margins_name='All')
汇总
pd.groupby(self,by='xx',axis=0,level=None,as_index=False,sort=True,group_keys=True,squeeze=False,**kwargs)['xx'].sum()
df.groupby(['xx'],as_index=False).agg(np.sum)
.agg({'xx':'sum'})
多重索引
一般情况下,直接打开的excel或者csv文件是不会出现多重索引的,但是通过数据透视之后的表有可能会出现多重索引,多重索引的选择如下。
tb2_4.index.get_level_values(1)
vlookup匹配实现
vlookup的功能是通过表合并的方式实现的,表合并一共有三种方式。
concat方法
#pd.concat([xx,xx])
pd.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False, keys=None, levels=None, names=None, verify_integrity=False, sort=None, copy=True)
merge方法
merge(left, right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=False, suffixes=('_x', '_y'), copy=True, indicator=False, validate=None)
join方法
join(self,other,on=None,how='left',lsuffix='',rsuffix='',sort=False)
如果匹不到,察看一下两张表’xx’的格式
print(df['xx'].dtypes)
merge和join时,一定要确保df2的唯一性,如果不唯一,就会多重匹配。
x=['','','']
for i in x:
locals()[i]=pd.read_csv(i+'.csv')
locals()[i]['xx']=in
文件导出
单文件导出
df.to_excel('xx',sheet_name='xx',index=None)
导出为excel时有可能出现数字的最后几位变成0
多个文件导出到一个excel
s1=pd.ExcelWriter('xx.xlsx')
df1.to_excel(s1,sheet_name='x1',index=None)
df2.to_excel(s1,sheet_name='x2',index=None)
s1.save()
其他
正则
re.complie
\d 数字
\D 非数字
\s 不可见的字符
\S 任何可见字符
. 除\n之外任何单个字符
* 任意次
+ 一次或多次(大于等于1)
? 零次或一次
内存回收
import gc
del a
gc.collect()