提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
一、pandas是什么?
示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。
二、使用步骤
- 数据分析使用,pandas三方库,安装pip install pandas
- excel表格数据样式设置,openpyxl三方库,安装pip install openpyxl
pandas api 可以查看博客:https://blog.csdn.net/weixin_45069552/article/details/109671383
openpyxl使用指导:https://blog.csdn.net/qq_40494873/article/details/1197909331. python 中的数组
pandas中数据为DataFrame,基于二维数组初始化DataFrame,所以先链接数组
代python中数组定义,dataFrame可以基于二位数组初始化:import pandas as pd import numpy as np import os def define_arrary(): ''' 数组定义 ''' arrary_single = np.random.randn(3) # <class 'numpy.ndarray' print(arrary_single) arrary_double = np.random.randn(3, 6) # <class 'numpy.ndarray' print(arrary_double) #二维数组 print("*"*100) arrary_three = np.random.randn(3, 6, 2) #三维数组 print(arrary_three) print("-"*100)
数组与列表的转换:
import pandas as pd import numpy as np import os def list_and_arrary(): ''' list 与 arrary 相互转换 ''' li_list = [i for i in range(10)] #<class 'list'> print(li_list)# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] ##列表转换为 数组 list_to_arrary = np.array(li_list) #<class 'numpy.ndarray'> print(list_to_arrary)#[0 1 2 3 4 5 6 7 8 9] ##数组转换为列表 arrary_single = np.random.randn(3) array_to_list = arrary_single.tolist() #<class 'list'> print(array_to_list) arrary_double = np.random.randn(3, 6) array_to_list = arrary_double.tolist() print(array_to_list)
2.python中Series数据类型
定义series数据类型,series实际是带索引的一维数组
定义pd.Series:import pandas as pd import numpy as np import os def define_series(): ''' 定义series数据类型,series实际是带索引的一维数组 ''' data = [1, 2, 3, 4] seri = pd.Series(data=data, index=['class1', 'class2', 'class3', 'class4']) print(seri) #带索引的一维数组 ''' class1 1 class2 2 class3 3 class4 4 ''' seri = pd.Series(data=data) #若不指定index,则默认从0开始 print(seri)
列表与pd.Series之间转换:
import pandas as pd import numpy as np import os def list_and_series(): ''' list 与 series 相互转换 ''' series = pd.Series([i for i in range(4)], index=['student1', 'student2', 'student3', 'student4']) # list to series print(type(series)) #<class 'pandas.core.series.Series'> list_se = series.to_list() # series直接转换为list print(type(list_se)) #<class 'list'> print(list_se) #return [0, 1, 2, 3] arrary_se = series.values #series 转换为array print(type(arrary_se))# <class 'numpy.ndarray'> print(arrary_se)#return [0 1 2 3] print(arrary_se.tolist()) #array转换为 list,return [0, 1, 2, 3]
3. pandas中数据结构 DataFrame
DataFrame中几种实例化方法:
import pandas as pd import numpy as np import os def define_dataFrame(): '''定义如下DataFrame,有三种定义方法: 第一种:data = 二维数组 第二种:data = [{列名:值},{列名:值}],此种方法{}中key为列名;{列名:{行名,值}, 列名:{行名,值}} 第三种:data = [Series1, Series2,],此种方法Series中index为列名 student1 student2 student3 student4 class1 10 20 30 40 class2 10 20 30 40 其他: Series.to_frame(name),此种方法将Series直接转换为DataFrame,其中Series中index为行名,name为列名 class1 student1 10 student2 20 student3 30 student4 40 ''' ###定义dataFrame:通过数组定义 data = np.random.randn(2,4) # 2 x 4 数组/矩阵 columns = ['student1', 'student2', 'student3', 'student4'] # 列名 index = ['class1', 'class2'] #行名 df = pd.DataFrame(data=data, columns=columns, index=index) print(df) df = pd.DataFrame(data=data) #若不指定columns、index,则默认0,1,2,3 print(df) ###定义dataFrame:通过字典定义,其中字典的key为列名 data_list_dict = [{'student1':1, 'student2':2, 'student3':3, 'student4':4}, {'student1':10, 'student2':20, 'student3':30, 'student4':40} ] df = pd.DataFrame(data=data_list_dict, index=['class1', 'class2']) print(df) df = pd.DataFrame(data_list_dict) print(df) ###定义dataFrame:通过完整的dict data_dict = {'student1':{'class1':10, 'class2':10}, 'student2':{'class1':20, 'class2':20}, 'student3':{'class1':30, 'class2':30}, 'student4':{'class1':40, 'class2':40} } df = pd.DataFrame(data=data_dict) print("*"*200) print(df) print("*"*200) ##定义DataFrame:通过Series定义,其中series中index为列名称,与dict一样 print('-'*100) series_list = [] seri = pd.Series(data=[10,20,30,40], index=['student1', 'student2', 'student3', 'student4']) print(seri) for i in range(2): series_list.append(seri) df = pd.DataFrame(data=series_list, index=['class1', 'class2']) print(df) ##直接通过Series可以之间转换为DataFrame seri_dataframe = seri.to_frame(name='class1') #此种方法,其中series中index为行名称, name为列名字 print(seri_dataframe) print(type(seri_dataframe)) #return <class 'pandas.core.frame.DataFrame'> ''' class1 student1 10 student2 20 student3 30 student4 40 '''
DataFrame中Merge, Join,Concat,用于表格数据合并:
可以查看博客:https://blog.csdn.net/ai_XX/article/details/100084617
也可以查看博客:https://segmentfault.com/a/1190000018537597import pandas as pd import numpy as np import os def caculate_dataFrame(): ''' 该函数用于列表的数据合并 Merge, Join,Concat方法详解:https://segmentfault.com/a/1190000018537597 ''' columns_head = ['student1', 'student2', 'student3', 'student4'] df = pd.DataFrame(np.random.rand(2,4), columns=columns_head) print(df) print("*"*200) df1 = pd.DataFrame(np.random.randn(4,2), columns=['student1', 'student3']) print(df1) print("*"*200) df2 = pd.DataFrame(np.random.randn(3,2), columns=['student5', 'student6']) print(df2) print("*"*200) ''' #axis代表横向、还是纵向拼接: axis=0 ,行拼接;axis=1, 列拼接; 默认为axis=0,行拼接 #join代表内连接,还是外连接:join=outer,外连接; join=inner,内连接; 默认为join=outer,外连接 #外连接、内连接,可以联想并集、交集 ''' print(pd.concat([df, df1, df2], axis=0, join='outer')) print(pd.concat([df, df1, df2], axis=1, join='outer')) # print(pd.concat([df, df1, df2], axis=1, join='inner')) #内连接,获取所有非空的数据
4. pandas操作excel表格
新建excel表格(示例):
import pandas as pd import numpy as np import os def writer_dataFrame_data_to_excel(): ''' 将dataFrame数据写入excel表格 sheet_name: 指定sheet名称;header:是否插入标题;index: 是否插入行索引 startrow:指定数据插入行位置,从0开始 startcol:指定数据插入列位置,从0开始 ''' data = np.random.randn(2,4) # 2 x 4 数组/矩阵 columns = ['student1', 'student2', 'student3', 'student4'] # 列名 index = ['class1', 'class2'] #行名 df = pd.DataFrame(data=data, columns=columns, index=index) ###新建表格,插入数据 out_excel = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'source/out.xlsx') try: writer = pd.ExcelWriter(out_excel, engine='openpyxl') df.to_excel(writer, sheet_name='student', header=True, index=True, startrow=0, startcol=0) writer.save() except Exception as e: print(e) print("create excel successful!")
excel中追加数据:
import pandas as pd import numpy as np import os def append_dataFrame_data_to_excel(): ''' 该方法用来向已有的表格追加数据: 两种实现思路: 一、将原始表格的数据读出来,然后和追加的数据合并,一次性重新插入全部数据;读写影响性能 二、读取原始表格已有数据位置,在后面直接追加新的数据;最理想的方法,读写性能优。 但是pandas插入数据的方法pd.to_excel(),这个方法缺少了一个类似pd.to_csv()中的mode参数,可以实现数据追加, 以至于每次写入数据都会覆盖原始数据,所以当前pandas我们只能使用第一种思路。 ''' out_excel = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'source/out.xlsx') df_origin = pd.read_excel(out_excel, engine='openpyxl') print(df_origin) df_origin_data = df_origin.iloc[:, 1:] #切片,提出第一列数据 head_colomns = df_origin_data.columns ##向原来的sheet页面中追加数据,求中: mode默认为 w df_append = pd.DataFrame(data=np.random.randn(8,4),columns=head_colomns) print(df_append) df = pd.concat([df_origin_data, df_append], join='outer', ignore_index=True) #ignore_index,重新设置index print(df) with pd.ExcelWriter(out_excel, engine='openpyxl') as writer: df.to_excel(writer) writer.save() #pd.ExcelWriter方法默认是xlsxwriter,但是xlsxwriter不支持append操作, 指定openpyxl; #mode=a 则会新增一个sheet页面,而非在原始sheet页后追加数据 with pd.ExcelWriter(out_excel, engine='openpyxl', mode='a') as writer: df_origin.to_excel(writer, sheet_name='Sheet1') writer.save()
读取excel表格中的数据&DataFrame中切片操作:
iloc方法,根据行、列序号获取数据- 据行列号选取:df.iloc[[行号],[列号]];例如:df.iloc[[0,3],[2,4]]
- 根据行列号切片:df.iloc[[行号],[列号]];例如:df.iloc[0:2,1:3]、df.iloc[0::2,1:3:1]
loc方法,根据行、列序名称获取数据
- 根据行列名选取:df.loc[[行名称],[列名称]];例如:df.loc[[2,3],['student1','student3']]
- 根据行列名称切片:df.iloc[[行名称],[列名称]];例如:df.loc[0:1,'student1':'student3']
filter方法,根据行、列名获取数据
- 根据列名选取:df.filter(items=['列名', '列名']);例如:df.filter(items=['student1', 'student3'])
- 根据行名选取:df.filter(items=['行名', '行名'],axis=0);例如:df.filter(items=[2,3], axis=0))
import pandas as pd import numpy as np import os def read_dataFrame_data_from_excel(): ''' 读取excel表格数据 ''' out_excel = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'source/out.xlsx') reader_df = pd.read_excel(out_excel) print(reader_df) print(reader_df.values) # dataFrame转换为数组 print(np.array(reader_df)) #dataFrame转换为数组 print(reader_df.to_dict()) #dataFrame 转换为字典 print(reader_df.to_json()) #dataFrame 转换为json print(reader_df.iloc[[0,3],[2,4]]) #根据行列号选取 print(reader_df.iloc[0:2,1:3]) #根据行列号切片 print(reader_df.iloc[0::2,1:3:1]) #根据行列号切片,可以指定补长 print(reader_df.loc[[2,3],['student1','student3']]) #根据行列名选取 print(reader_df.loc[0:1,'student1':'student3']) #根据行列名称切片 print(reader_df.filter(items=['student1', 'student3'])) #获取列 print(reader_df.filter(items=[2,3], axis=0)) #获取行
5.pandas操作csv文件
pandas操作csv,可以指定mode=‘w’/‘a’。可以实现数据追加
代码如下(示例):import pandas as pd import numpy as np import os def new_and_append_data_to_csv(): ''' 该函数演示pandas中对CSV的操作:创建csv文件、追加数据,读取数据等 csv:和普通文件类似,通过指定mode来实现csv文件数据的新建,追加等操作 ''' df = pd.DataFrame(data=np.random.randn(8,4), columns=['student1', 'student2','student3','student4']) out_csv = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'source/out.csv') df.to_csv(out_csv, mode='w') df1 = df.copy() df1.to_csv(out_csv,mode='a', header=False) print("update csv successful!") df_reader = pd.read_csv(out_csv) print(df_reader) print(df_reader.shape) # (16, 5), (行数,列数) print(df_reader.index) # RangeIndex(start=0, stop=16, step=1),行标签 print(df_reader.columns) #Index(['Unnamed: 0', 'student1', 'student2', 'student3', 'student4'], dtype='object') print(df_reader.head()) #获取头部几条数据,默认5条 print(df_reader.tail(2)) #获取尾部几条数据,默认5条 ##3 在这里暂时不介绍关于csv数据 大数据读取,分块读取
# 总结 提示:这里对文章进行总结: 例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。