import pandas as pd
”’Pandas模块是基于NumPy模块开发的,它不仅能直观地展现数据结构,还具备强大的数据处理和分析功能。
从某种程度上来说,pandas模块是Python成为强大而高效的数据分析工具的重要因素之一。”’
print(‘——————数据结构———————‘)
”’pandas模块中有两个重要的数据结构对象:Series和DataFrame。
使用这两个数据结构对象可以在计算机的内存中构建虚拟的数据库”’
print(‘————–Series对象———————-‘)
”’Series是一种类似于NumPy模块创建的一维数组的对象,
与一维数组不同的是,Series对象不仅包含数据元素,还包含一组与数据元素对应的行标签,
行标签的数字序列默认从0开始,通过行标签可以定位数据结构中的元素”’
s=pd.Series([‘衣服’,’裤子’,’鞋子’])
print(s)
”’
0 衣服
1 裤子
2 鞋子
dtype: object
”’
print(‘———-‘)
”’如果想要在创建数据结构时自定义元素的行标签,可以使用Series对象的参数index传入元素的行标签列表”’
s1=pd.Series([‘衣服’,’裤子’,’鞋子’],index=[‘a1′,’a2′,’a3’])
print(s1)
”’
a1 衣服
a2 裤子
a3 鞋子
dtype: object”’
print(s1[1]) #裤子
print(‘——–DataFrame对象—————‘)
”’DataFrame对象是一种二维的数据结构对象,用该对象创建的数据结构在形式上类似于Excel表格。
相比Series对象,DataFrame对象在实际工作中的应用更为广泛”’
#使用DataFrame对象基于列表创建数据结构的方法
df=pd.DataFrame([[‘秋衣’,66],[‘秋裤’,77],[‘秋天’,99]])
print(df)
”’
0 1
0 秋衣 66
1 秋裤 77
2 秋天 99”’
”’从运行结果可以看出,创建了一个二维数据结构,
数据结构中的元素既有行标签又有列标签,其值都默认为从0开始的数字序列”’
print(‘—‘)
”’在使用DataFrame对象创建数据结构时,还可以通过设置参数columns和index来分别自定义行标签和列标签”’
df1=pd.DataFrame([[‘裤子’,22],[‘鞋子’,33],[‘帽子’,66]],columns=[‘产品’,’单价’],index=[‘a1′,’a2′,’a3’])
print(df1)
”’
产品 单价
a1 裤子 22
a2 鞋子 33
a3 帽子 66
”’
print(‘—‘)
#使用DataFrame还可以基于字典创建数据结构
df2=pd.DataFrame({‘产品’:[‘裤子’,’鞋子’,’帽子’],’单价’:[22,33,66]})
”’为DataFrame对象传入了一个字典来创建数据结构,
字典的键(key)是数据结构元素的列标签,字典的值(value)是数据结构的元素”’
print(df2)
”’
产品 单价
0 裤子 22
1 鞋子 33
2 帽子 66”’
”’从运行结果可以看到,由于没有设置行标签,数据结构的行标签默认为从0开始的数字序列。
如果要自定义行标签,可以使用参数index”’
print(‘—‘)
df3=pd.DataFrame({‘产品’:[‘裤子’,’鞋子’,’帽子’],’单价’:[22,33,66]},index=[‘a1′,’a2′,’a3’])
print(df3)
”’
产品 单价
a1 裤子 22
a2 鞋子 33
a3 帽子 66”’
print(‘—————–读取数据—————–‘)
”’使用pandas模块可以从多种类型的文件中读取数据,包括Excel工作簿可csv格式文件等”’
#读取Excel工作簿数据
”’使用pandas模块中的read_excel()函数即可读取Excel工作簿数据”’
#读取某个工作表的数据
”’一个Excel工作簿可能包含多个工作表,可以通过read_excel()函数中的参数sheet_name指定读取哪个工作表。
read_excel()函数的第1个参数用于指定要读取的工作簿的文件路径,可以使用相对路径(与Python文件同一个文件夹下)也可以使用绝对路径。
第2个参数sheet_name用于指定从哪张工作表中读取数据,其值可以是整形数字或者字符串。
当参数是整形数字时,以0代表第一张工作表,1代表第二章工作表,以此类推;
当参数是字符串时,会读取对应字符串的工作表名。
如果省略sheet_name参数,则默认读取工作簿中的第一个工作表
read_excel()函数会使用读取的数据创建一个DataFrame()对象
”’
data=pd.read_excel(‘工作簿.xlsx’,sheet_name=0)
print(data)
”’
排名 股票代码 股票名称
0 1 2079 苏州固锝
1 2 2553 南方精工
2 3 2049 紫光国微
3 4 600732 爱旭股份
4 5 519 中兵红箭
5 6 2865 钧达股份
6 7 2943 宇晶股份
7 8 603398 沐邦高科
8 9 603728 鸣志电器
9 10 600188 兖矿能源
”’
print(‘———-指定读取数据的列标签————‘)
”’在使用read_excel()函数读取数据时,可以通过设置参数header来使用数据表的第几行(从0开始计数)的内容作为列标签(从第几行开始)。
当省略该参数或将其值设为0时,表示用数据表的第一行内容作为列标签”’
data=pd.read_excel(‘工作簿.xlsx’,sheet_name=0,header=6)
print(data)
”’
6 002865 钧达股份
0 7 2943 宇晶股份
1 8 603398 沐邦高科
2 9 603728 鸣志电器
3 10 600188 兖矿能源
”’
print(‘—‘)
#如果要将列标签设为从0开始的数字序列,可以将参数header设置为None
data=pd.read_excel(‘工作簿.xlsx’,sheet_name=0,header=None)
print(data)
”’
0 1 2
0 排名 股票代码 股票名称
1 1 002079 苏州固锝
2 2 002553 南方精工
3 3 002049 紫光国微
4 4 600732 爱旭股份
5 5 000519 中兵红箭
6 6 002865 钧达股份
7 7 002943 宇晶股份
8 8 603398 沐邦高科
9 9 603728 鸣志电器
10 10 600188 兖矿能源
”’
print(‘———-指定读取数据的行标签———–‘)
”’read_excel()函数的参数index_col用于指定使用数据表的第几列(从0开始计数)的内容作为行标签(从第几列开始)。
当省略该参数或将其值设为0时,表示使用数据表第1列的内容作为行标签”’
data=pd.read_excel(‘工作簿.xlsx’,sheet_name=’Sheet1′,index_col=0)
print(data)
#因为index_col的值为0,所以【排名】在这个位置
”’
股票代码 股票名称
排名
1 2079 苏州固锝
2 2553 南方精工
3 2049 紫光国微
4 600732 爱旭股份
5 519 中兵红箭
6 2865 钧达股份
7 2943 宇晶股份
8 603398 沐邦高科
9 603728 鸣志电器
10 600188 兖矿能源”’
print(‘—‘)
data=pd.read_excel(‘工作簿.xlsx’,sheet_name=0,index_col=2)
print(data)
#因为index_col的值为2所以【股票代码】在这个位置
”’
排名 股票名称
股票代码
2079 1 苏州固锝
2553 2 南方精工
2049 3 紫光国微
600732 4 爱旭股份
519 5 中兵红箭
2865 6 钧达股份
2943 7 宇晶股份
603398 8 沐邦高科
603728 9 鸣志电器
600188 10 兖矿能源
”’
print(‘——-读取指定列———-‘)
”’如果只需读取数据表的某一列或某几列,可以使用参数usecols指定要读取的列
usecols参数要写在[]里面,只有与1个数值表示指定读取第几列,要读取多列,可以在[]中用,隔开,比如[0,1,2],
如果要读取的列没有内容,会显示Empty DataFrame
Columns: []
Index: []
”’
data=pd.read_excel(‘工作簿.xlsx’,sheet_name=0,usecols=[0])
print(data)
”’
排名
0 1
1 2
2 3
3 4
4 5
5 6
6 7
7 8
8 9
9 10”’
print(‘—‘)
data=pd.read_excel(‘工作簿.xlsx’,usecols=[2])
print(data)
”’
股票名称
0 苏州固锝
1 南方精工
2 紫光国微
3 爱旭股份
4 中兵红箭
5 钧达股份
6 宇晶股份
7 沐邦高科
8 鸣志电器
9 兖矿能源”’
print(‘—‘)
data=pd.read_excel(‘工作簿.xlsx’,usecols=[0,2])
print(data)
”’
排名 股票名称
0 1 苏州固锝
1 2 南方精工
2 3 紫光国微
3 4 爱旭股份
4 5 中兵红箭
5 6 钧达股份
6 7 宇晶股份
7 8 沐邦高科
8 9 鸣志电器
9 10 兖矿能源”’
print(‘————读取CSV文件数据——————-‘)
”’
读取csv文件要用到pandas模块中的read_csv()函数
csv是一种存储数据的文件格式,其本质上是一个文本文件,只能存储文本,不能存储格式、公式、宏等,所以占用的空间比较小。
csv文件一般用逗号分隔一系列值,它既可以用Excel打开,也可以用记事本这样的文本编辑器打开
如果出现【UnicodeDecodeError: ‘utf-8’ codec can’t decode byte 0xb7 in position 0: inva】这样的报错,
可以在read_csv()函数中加入【encoding=’utf-8’】【encoding=’gbk’】【encoding=”gb18030”】
”’
”’
演示文件的csv.csv文件内容如下:
002079,苏州固锝
002553,南方精工
002049,紫光国微
600732,爱旭股份
000519,中兵红箭
002865,钧达股份
002943,宇晶股份
603398,沐邦高科
603728,鸣志电器
600188,兖矿能源
”’
data=pd.read_csv(‘csv.csv’,encoding=’gbk’)
print(data)
”’
002079 苏州固锝
0 2553 南方精工
1 2049 紫光国微
2 600732 爱旭股份
3 519 中兵红箭
4 2865 钧达股份
5 2943 宇晶股份
6 603398 沐邦高科
7 603728 鸣志电器
8 600188 兖矿能源”’
print(‘—‘)
”’如果只想读取csv文件前几行的数据,可在read_csv()函数中设置参数nrows值”’
data=pd.read_csv(‘csv.csv’,nrows=2,encoding=’gbk’) #读取前3行的数据
print(data)
”’
002079 苏州固锝
0 2553 南方精工
1 2049 紫光国微
”’
print(‘—————查看数据———————‘)
#当我们有了数据后,还需要查看数据的基本情况。对数据有了初步的了解,才能更好的分析数据
print(‘——-查看数据的前几行—————‘)
”’使用read_excel()或read_csv()读取数据并创建DataFrame对象后,如果想通过查看数据的前几行来大致判断读取结果是否满足要求,
可以使用DataFrame对象的head()函数来控制要显示的行数,
当head()函数不设置参数值时,表示查看数据的前5行(加上第一行表头共6行)”’
data=pd.read_excel(‘工作簿.xlsx’)
print(data.head()) #不设置参数默认查看前6行
print(‘—‘)
data=pd.read_excel(‘工作簿.xlsx’)
print(data.head(2))
”’
1 Unnamed: 1 002079 苏州固锝
0 2 NaN 2553 南方精工
1 3 NaN 2049 紫光国微”’
print(‘———–查看数据的行数和列数—————‘)
”’DataFrame对象有一个shape属性可以查看函数和列数。
用shape属性获取数据的行数和列数时,不会把行索引和列索引计算在内,
返回的结果是一个元组,其中的两个元素分别代表数据的行数和列数。
可以通过元组中提取元素的方法来单独获取数据的行数或列数”’
data=pd.read_excel(‘工作簿.xlsx’)
print(data.shape) #(9, 4)
print(‘————查看数据的类型————————-‘)
”’使用DataFrame对象的info()函数可以查看读取的数据中各列的数据类型”’
data=pd.read_excel(‘工作簿.xlsx’)
print(data.info())
”’
<class ‘pandas.core.frame.dataframe’=””>
RangeIndex: 9 entries, 0 to 8
Data columns (total 4 columns):
# Column Non-Null Count Dtype
— —— ————– —–
0 1 9 non-null int64
1 Unnamed: 1 0 non-null float64
2 002079 9 non-null int64
3 苏州固锝 9 non-null object
dtypes: float64(1), int64(2), object(1)
memory usage: 416.0+ bytes
None”’
”'(total 4 columns)表示一共有4列,之后几行可以得知各列的标签和数据类型”’
print(‘—‘)
#如果只想查看单独某一列的数据类型,可以使用dtype属性
print(data[‘股票代码’].dtype) #int64 #[]中的内容是指定列的第一行,或者说表头
print(‘—‘)
#如果需要转换数据的类型,可以使用astype()函数
data=pd.read_excel(‘工作簿.xlsx’)
data[‘排名’]=data[‘排名’].astype(‘float64’)
#测试的文件没有表头,直接是内容,从第2行开始,第一行内容为1的单元格这一列,全都转换为float64格式,之所以会从第2行开始转换,设计者的原意应该是跳过第一行的表头
print(data)
”’
排名 股票代码 股票名称
0 1.0 2079 苏州固锝
1 2.0 2553 南方精工
2 3.0 2049 紫光国微
3 4.0 600732 爱旭股份
4 5.0 519 中兵红箭
5 6.0 2865 钧达股份
6 7.0 2943 宇晶股份
7 8.0 603398 沐邦高科
8 9.0 603728 鸣志电器
9 10.0 600188 兖矿能源”’
print(‘————–选择数据——————-‘)
”’在读取的数据中,我们既可以选择单行数据,也可以选择多行数据,还可以按照指定的条件选择数据”’
#先用read_excel()函数读取工作簿中某个工作表的数据,创建一个DataFrame对象作为选择行数据的操作对象
data=pd.read_excel(‘工作簿.xlsx’,index_col=2)
”’此处的index_col参数,用于指定哪些列用作数据框行索引,此处指定第3列”’
”’在DataFrame中选择单行数据有loc和iloc两种方法,它们选择数据时的依据不相同:
loc方法可以依据行标签选择单行数据”’
print(data.loc[‘中兵红箭’]) #这条代码好像只有在没有设置index_col的时候才能运行,根据索引值选择行
#上面已经指定了第三列,这里指定第三列中的单元格内容是中兵红箭这一行
”’如果之前的代码不设置index_col参数,下面的loc参数直接填写某行的索引值,就能指定读取第几行,是这样的吗?
loc参数是数值,[1]表示不算表头在内的,第2行的内容,加上其对应的表头
#也可以按照指定的某一行单元格的第一个单元格的内容,来读取这一整行的数据,loc的参数格式是[‘单元格文本’]
”’
”’
排名 5
股票代码 519
Name: 中兵红箭, dtype: int64
”’
print(‘—‘)
print(‘loc方法也可以根据行标签来选择多行数据:’)
#print(data.loc[[1,2]]) #这条代码好像只有在没有设置index_col的时候才能运行,根据索引值选择行
”’
排名 股票代码 股票名称
1 2 2553 南方精工
2 3 2049 紫光国微”’
print(‘—‘)
print(data.loc[[‘兖矿能源’,’中兵红箭’]])
”’
排名 股票代码
股票名称
兖矿能源 10 600188
中兵红箭 5 519”’
print(‘—‘)
”’使用iloc[]方法可以依据序号(从0开始计数)选择单行数据”’
print(data.iloc[1])
”’排名 2
股票代码 2553
股票名称 南方精工
Name: 1, dtype: object”’
print(‘—‘)
#使用iloc方法选择多行数据
print(data.iloc[[2,3]]) #选择不算第一行表头在内的,索引值为2和3的行
”’
排名 股票代码
股票名称
紫光国微 3 2049
爱旭股份 4 600732”’
print(‘—‘)
”’使用iloc方法还可以通过类似列表切片的方式,对指定的行序号区间按照“左闭右开”的规则选择连续的行”’
print(data.iloc[0:2]) #选择不算第一行表头在内的,索引值0到索引值2之前的行内容
”’
排名 股票代码
股票名称
苏州固锝 1 2079
南方精工 2 2553”’
print(‘—‘)
”’除了依据行标签或行序号选择行数据外,还能依据指定条件选择行数据”’
#data=pd.read_excel(‘工作簿.xlsx’,sheet_name=0,index_col=1)
data = pd.read_excel(‘工作簿.xlsx’, sheet_name=0, index_col=0)
print(data)
”’
排名 股票名称
股票代码
2079 1 苏州固锝
2553 2 南方精工
2049 3 紫光国微
600732 4 爱旭股份
519 5 中兵红箭
2865 6 钧达股份
2943 7 宇晶股份
603398 8 沐邦高科
603728 9 鸣志电器
600188 10 兖矿能源”’
#a = data[‘排名’] != 3004
#print(data[a])
#print(data[a])
#
#上面代码报错,将来再解决,参考书是《零基础学Python爬虫、数据分析与可视化从入门到精通 4.4 选择数据》
”’line 3623, in get_loc
raise KeyError(key) from err
KeyError: ”’
print(‘———–选择列数据—————–‘)
”’选择列数据有两种方法:
第一种是指定列标签来实现,
第二种是使用iloc方法,通过指定行序号和列序号来实现”’
data=pd.read_excel(‘工作簿.xlsx’)
print(data[‘股票名称’]) #选择列标签(表头)为【股票名称】的这一列
”’
0 苏州固锝
1 南方精工
2 紫光国微
3 爱旭股份
4 中兵红箭
5 钧达股份
6 宇晶股份
7 沐邦高科
8 鸣志电器
9 兖矿能源
Name: 股票名称, dtype: object”’
print(‘—‘)
#选择多列数据
print(data[[‘股票名称’,’股票代码’]])
#源数据中,股票代码这一列在股票名称之前,但按这样的 顺序写,输出的内容在,股票代码这一列在股票名称这一列之后
”’
股票名称 股票代码
0 苏州固锝 2079
1 南方精工 2553
2 紫光国微 2049
3 爱旭股份 600732
4 中兵红箭 519
5 钧达股份 2865
6 宇晶股份 2943
7 沐邦高科 603398
8 鸣志电器 603728
9 兖矿能源 600188”’
print(‘—‘)
#使用iloc方法也可以选中多列数据
print(data.iloc[:,[1,2]])
””[]中逗号,之前的部分表示要选择的行序号,只输入一个冒号表示选择所有行;
逗号之后的部分表示要选择的列需要,多个列序号可以用列表的形式给出,此处表示选择索引为1和2的列
”’
”’
股票代码 股票名称
0 2079 苏州固锝
1 2553 南方精工
2 2049 紫光国微
3 600732 爱旭股份
4 519 中兵红箭
5 2865 钧达股份
6 2943 宇晶股份
7 603398 沐邦高科
8 603728 鸣志电器
9 600188 兖矿能源”’
print(‘—‘)
#如果要选择多列数据,可以使用iloc[]方法通过类似列表切片的方式来实现,遵循“左闭右开”的规则
print(data.iloc[:,0:2]) #逗号前面的冒号表示选择所有行,逗号之后的0::2表示选择索引值0到索引值2之前的列
”’
排名 股票代码
0 1 2079
1 2 2553
2 3 2049
3 4 600732
4 5 519
5 6 2865
6 7 2943
7 8 603398
8 9 603728
9 10 600188”’
print(‘———同时选择行列数据——————–‘)
”’如果要同时选择行列数据,可以通过loc和iloc方法实现”’
#使用loc方法依据行标签和列标签同时选择行列数据
”’
#==============报错=====================
data=pd.read_excel(‘工作簿.xlsx’,sheet_name=0,index_col=1)
data1=data.loc[[‘600732′,’603398’],[‘股票代码’,’股票名称’]]
#选择行标签为600732与603398的行,以及列标签为股票代码与股票名称的列
print(data1)
”’
#使用iloc方法依据行序号和列序号同时选择行列数据
data=pd.read_excel(‘工作簿.xlsx’)
data2=data.iloc[[1,2],[1,2]]
print(data2)
”’
股票代码 股票名称
1 2553 南方精工
2 2049 紫光国微”’
print(‘——————-修改行标签和列标签——————–‘)
”’行标签和列标签是查找数据的依据,读取数据后,如果生成的标签不便于我们查找数据,可以修改标签。
读取数据时默认添加的行标签为从0开始的整数序列。如果要修改行标签,可以使用set_index()函数
rename()函数可以用于重命名行标签和列标签
”’
data=pd.read_excel(‘工作簿.xlsx’)
print(data)
print(‘—‘)
”’
排名 股票代码 股票名称
0 1 2079 苏州固锝
1 2 2553 南方精工
2 3 2049 紫光国微
3 4 600732 爱旭股份
4 5 519 中兵红箭
5 6 2865 钧达股份
6 7 2943 宇晶股份
7 8 603398 沐邦高科
8 9 603728 鸣志电器
9 10 600188 兖矿能源”’
#使用股票名称作为行标签
print(data.set_index(‘股票名称’))
”’
排名 股票代码
股票名称
苏州固锝 1 2079
南方精工 2 2553
紫光国微 3 2049
爱旭股份 4 600732
中兵红箭 5 519
钧达股份 6 2865
宇晶股份 7 2943
沐邦高科 8 603398
鸣志电器 9 603728
兖矿能源 10 600188”’
print(‘—‘)
#可以使用rename()函数,对行标签和列标签重命名
data=data.rename(columns={‘排名’:’序号’,’股票代码’:’代码’,”股票名称”:”名称”},index={0:’A’,1:’B’,2:’C’})
#将rename()函数的参数columns和index都设置为一个字典,字典的key{键}为原来的列标签或行标签,valueu(值)为新的列标签或行标签
print(data)
”’
序号 代码 名称
A 1 2079 苏州固锝
B 2 2553 南方精工
C 3 2049 紫光国微
3 4 600732 爱旭股份
4 5 519 中兵红箭
5 6 2865 钧达股份
6 7 2943 宇晶股份
7 8 603398 沐邦高科
8 9 603728 鸣志电器
9 10 600188 兖矿能源”’
print(‘—‘)
#还可以通过为DataFrame的columns属性和index属性重新赋值来分别修改列标签和行标签,有多少行多少列就得写多少,否则会报错
data=pd.read_excel(‘工作簿.xlsx’)
data.columns=[‘数字’,’申购码’,’简称’]
data.index=[‘AA’,’BB’,’CC’,’d’,’e’,’f’,’g’,’h’,’i’,’j’]
print(data)
”’
数字 申购码 简称
AA 1 2079 苏州固锝
BB 2 2553 南方精工
CC 3 2049 紫光国微
d 4 600732 爱旭股份
e 5 519 中兵红箭
f 6 2865 钧达股份
g 7 2943 宇晶股份
h 8 603398 沐邦高科
i 9 603728 鸣志电器
j 10 600188 兖矿能源”’