本文主要针对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列插入最终分,并名命为成绩