Python-Pandas-Excel/CSV 数据处理大全整理 (一)

本文主要针对Python处理Excel & CSV文件的应用。所有代码均实例化代入且逐条备注解释。

全文逐条手工输入整理,可能会产生错误之处,还请指正。

之后会陆续整理 “爬虫” 与 “金融量化分析” 两个文档

#   --------------------------------------------------------------------------------------------

DataFrame:二维数据,相当于Excel中一整个sheet表格,含多行多列(以下简称df)
Series:一维数据,相当于Excel中一行或一列
df.index:索引名
df.columns:列名

基础:Excel & CSV 数据的读取/建立/保存

1. 读取数据
1.1读取EXCEL数据
路径='C:/pandas/读取文件.xlsx'
数据源=pd.DataFrame(pd.read_excel(路径,header=None,names=['编号','姓名','年龄','日期'],index_col='编号'))   
# 将'编号','姓名','年龄','日期'设为列名,同时将编号列作为索引列

1.2 读取CSV数据
路径='C:\pandas\读取文件.txt'      
数据源=pd.DataFrame(pd.read_csv(r'路径',sep='^'))
# 特别注意"/"&"\"的差异("\"为直接复制文件位置的地址,下条代码需为 r'路径')
# CSV文件需要特别注意分隔符的运用,此处使用 ‘ ^ ’ 作为分隔符

2.建立数据
2.1
数据=pd.Series(['Ham','男','20','2010-10-1'],index=['姓名','性别','年龄','生日'])
2.2
字典1={'姓名':'Ham','性别':'男','年龄':20,'日期':'2010-10-1'}
字典2={'姓名':['Ham','Jack'],'年龄':[18,20]}
数据1=pd.Series(字典1)
数据2=pd.DataFrame(字典2)
2.3
列表1=['姓名','性别','年龄','日期']
列表2=['Ham','男',20,'2010-10-1']
数据=pd.Series(列表2,index=列表1)

3.保存数据
数据源.to_excel(路径) 

一、数据查询/筛选(单一条件/多条件筛选):
 如果被查询数据中含有日期,需要将日期作为索引列:1.首先将日期列设为索引   2.将日期列设置为日期格式   3. 将日期列进行排序
 

路径= 'C:/pandas/透视.xlxs'
数据=pd.read_excel(r'路径',index_col='出生日期')    

print(数据.loc['1949-10-1','化学'])            
# 查询行为1949-10-1,列为化学的值

print(数据.loc['1949-10-1',['化学','英语','物理']])     
# 在化学or英语or物理列,查询行为1949-10-1的值,

print(数据.loc['1949-10-1':'1952-10-1',['化学','英语','物理']])       
# 查询行从1949-10-1至1952-10-1,列为化学or英语or物理的值

print(数据.loc['1949-10-1':'1952-10-1',['化学':'物理']])        
# 查询行从1949-10-1至1952-10-1,列为化学至物理之间的值

print(数据.loc[(数据['化学']>=80)&(数据['物理']>=90)])            
# 查询化学>=80分且物理>=90分的值

数据.loc[数据['性别']=='男','称呼']='先生'                     
# 新增称呼列,将性别列为男的,定义为先生

数据1=数据.loc[2:4]                                         
# 筛选1~4行的数据

条件=数据['性别']=='男'                                
# 筛选出性别为男的数据

条件='性别'=='男'and 总分>=120“                       
# 筛选出性别为男且总分>=120的值

条件="姓名 in ['王五','赵六']"                          
# 筛选出姓名为王五or赵六的的值

条件=数据['姓名'].str.startswith('王')                
# 筛选出姓名列首字为王姓的人的值

条件=数据['姓名'].str.endwith('五')                    
# 筛选出姓名列以五字结尾的人的值

条件=数据['地址'].str.contains('上海')                 
# 筛选出地址列中含有上海的值

条件=数据['地址'].str.contains('[a-cA-C]栋')            
# 筛选出地址中含有小写a~c栋或大写A-C栋的值  ([a-cA-C]为正则表达式)

print(数据[条件])

print(数据.query(条件))                         
# 输入query后可自动识别字符串
数据=pd.read_excel(r'路径',index_col='出生日期',parse_dates=['出生日期'])
数据1=数据.sort_values('出生日期')

print(数据1.turncate(before='1949').head())                
# turncate 为对数据的截取

print(数据1.turncate(after='1949-12').head())              
# 筛选出日期 1949-12 后的数值 (前提先将日期列排序)

print(数据1.turncate(before='1949-02').head())             
# 筛选出日期 1949-02 前的数值 (前提先将日期列排序)

print(数据1.turncate(before='1949-02-20').head())
# 筛选出日期 1949-02-20 前的数值 (前提先将日期列排序)

print(数据1['1949-10-1':'1949-12-31'])                     
# 筛选出日期 1949-10-1 至 1949-12-31 之间的数值



二、透视表 Pivot_table:

路径='C:/pandas/透视.xlxs'
数据=pd.read_excel(r'路径')

数据1=pd.pivot_table(数据,index=['部门','销售人员'],values=['数量','金额'])
# 1.pivot_table 为透视表函数  2.将非数字列部门&销售人员设为索引   3.value只显示数量&金额列(否则将会显示所有列)

数据1=pd.pivot_table(数据,index=['部门','销售人员'],values=['数量','金额'],columns='所属区域',aggfunc=[sum(),sum()])
# 1.显示所有区域各区域数量&金额   2.aggfunc为设置数量&金额对应的计算方式

数据1=pd.crosstab([数据.月份.dt.month,数据.所属区域],数据.部门,margins=True)
# 1.crosstab为交叉表,计数时使用   2.根据月份&所属区域,统计各部门数据   3.margins=True,添加行/列的小计和总和


三、分组或合并 Groupby:

路径='C:/pandas/分组.xlxs'
数据=pd.read_excel(r'路径')

数据1=数据.groupby(['城市','区县'])[['人数','金额']].sum()           
# 按城市和区县组合合并,并对人数和金额求和

字典={'1月份':'sum','2月份':'count','3月份':'max','4月份':'mean'}       
# 对1月份列的求和统计,对2月份列的计数统计,对3月份列的最大值统计,对4月份列的平均值统计

数据1=数据.groupby('店名').agg(字典)    
# groupby 是基于行的合并,agg 是基于列的合并

数据1=数据.groupby(level='班级').mean()        
# 对各班级这行求平均


四、数据排序 Sort_values:

数据.sort_values(by='化学',ascending=False,inplace=False)      
# ascending:False为降序,True为升序
# inplace:False为在数据源上排序,True为将排序后的数据新建一个数据表,保留数据源

数据.sort_values(by=['化学','数学','语文'],ascending=[False,True,False],inplace=False)    
# 依次对化学、数学、语文的值进行降序、升序、降序的排列

数据.sort_index(inplace=True,ascending=False)            
# 对索引降序排序

数据.sort_values(by=1,inplace=True,ascending=False,axis=1)           
# 对索引第一行排序

数据.sort_values(by=[1,2],inplace=False,ascending=[False,True],axis=1)      
# 对索引第一行和第二行排序


五、Apply/Map/Apply map 的运用

路径='C:/pandas/数据源.xlxs'
数据=pd.read_excel(r'路径')
字典={'男':'先生','女':'女士'}               
# 建立字典

数据['称呼']=数据['性别'].map(字典)           
# 将数据的性别列中,男改为先生,女改为女士。并存入新建的称呼列中

数据['性别']=数据['性别'].map(字典)          
# 直接在数据的性别列中,将男改为先生,女改为女士

数据1=数据[['语文','数学','英语']].apply(sum,axis=0)      
# 对语文、数学、英语三列的数据分别求和。axis=0表示列,axis=1表示行

def BMI(数据):
    身高=数据['身高']
    体重=数据['体重']
    BMI=体重/身高**2
    return BMI
数据['BMI']=数据.apply(BMI,axis=1)             
#  BMI列应用公式:(体重/身高)的平方

数据1=数据.applymap(lambda x:"%.3f" % x)     
#  将数据保留三位小数

六、Merge/Insert 的运用 (等同于Excel中VLOOKUP查询匹配功能)

路径='C:/pandas/数据源.xlxs'
数据1=pd.read_excel(r'路径',sheet_name='学生名单')
数据2=pd.read_excel(r'路径',sheet_name='成绩单')

结果=pd.merge(数据1,数据2.loc[:,['学号','总分']],how='left',on='学号')
# 1.以数据1为基准,将数据2匹配过来   2.[:,['学号','总分']]表示数据1行全选,数据2只选学号和总分  3.on='学号'表示以学号为匹配值

最终分=结果.总分            
# 将结果中的总分列赋值给最终分

结果=结果.drop('总分',axis=1)                
#  删除结果中的总分列

结果.insert(0,'成绩',最终分)                
#  在第0列插入最终分,并名命为成绩

你可能感兴趣的:(python,pandas,数据分析,python,数据挖掘)