提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。
pandas api 可以查看博客:https://blog.csdn.net/weixin_45069552/article/details/109671383
openpyxl使用指导:https://blog.csdn.net/qq_40494873/article/details/119790933
pandas中数据为DataFrame,基于二维数组初始化DataFrame,所以先链接数组
代python中数组定义,dataFrame可以基于二位数组初始化:
import pandas as pd
import numpy as np
import os
def define_arrary():
'''
数组定义
'''
arrary_single = np.random.randn(3) #
print(arrary_single)
arrary_double = np.random.randn(3, 6) #
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)] #
print(li_list)# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
##列表转换为 数组
list_to_arrary = np.array(li_list) #
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() #
print(array_to_list)
arrary_double = np.random.randn(3, 6)
array_to_list = arrary_double.tolist()
print(array_to_list)
定义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)) #
list_se = series.to_list() # series直接转换为list
print(type(list_se)) #
print(list_se) #return [0, 1, 2, 3]
arrary_se = series.values #series 转换为array
print(type(arrary_se))#
print(arrary_se)#return [0 1 2 3]
print(arrary_se.tolist()) #array转换为 list,return [0, 1, 2, 3]
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
'''
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/1190000018537597
import 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')) #内连接,获取所有非空的数据
新建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方法,根据行、列序号获取数据
loc方法,根据行、列序名称获取数据
filter方法,根据行、列名获取数据
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)) #获取行
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数据 大数据读取,分块读取