使用pandas代替excel的总结

使用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()
  • 45
    点赞
  • 159
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Pandas写入Excel文件时,可能会出现"Permission Denied"的错误提示,表示没有权限。这通常是由于以下原因造成的: 1. 文件被其他进程或程序锁定。在某些情况下,Excel文件正在被其他程序(如Microsoft Excel本身)打开,这会导致无法写入文件。请确保在写入Excel文件之前,关闭所有关于该文件的程序和进程。 2. 文件路径或文件名错误。请检查您提供的文件路径是否正确,并确保该路径下存在该文件。如果文件名错误,或者没有在指定路径下创建文件,将无法进行写入操作。 3. 文件或文件夹权限设置不正确。请确保您正在使用的用户帐户具有对文件或文件夹的写入权限。如果没有写入权限,您需要以管理员身份运行代码,或者修改文件或文件夹的权限设置。 4. Pandas版本问题。某些旧版本的Pandas可能存在写入Excel时的权限问题。尝试升级Pandas到最新版本,以确保您使用的是最稳定和支持的版本。 如果您仍然遇到无权限的问题,您可以尝试以下解决方法: 1. 确认文件没有被其他进程锁定或打开。关闭所有可能影响文件访问的程序,然后重新运行代码。 2. 尝试将文件保存到不同的路径或文件夹中,确保路径和文件名正确,并有写入权限。 3. 以管理员身份运行代码。右键单击代码文件,选择“以管理员身份运行”,然后再次尝试写入Excel文件。 4. 使用其他的Excel写入库。如果问题仍然存在,可以尝试使用其他的Excel写入库,如Openpyxl或XlsxWriter,来代替Pandas的写入功能。 希望这些解决方法能够帮助您解决权限问题。如果问题仍然存在,请尝试提供更多详细的错误信息和代码,以便我们能够更好地帮助您解决问题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值