- 一:Pandas了解
- (1)什么是Pandas
- (2)Pandas优势
- (3)Pandas安装
- (4)Pandas核心数据结构
- 二:DataFrame类型
- (1)DataFrame结构
- (2)DataFrame构造方法
- (3)DataFrame索引
- A:基本设置方法
- B:其他操作(先看第 (4)再看这个)
- ①:修改行列索引值
- ②:重设索引
- ③:使用字典设置索引
- ④:把某列设置为新的索引
- (4)DateFrame常用属性和方法
- A:属性
- B:方法
- 三:Series类型
- (1)Series结构与创建
Pandas是2008年WesMcKinney开发出的库,是一个专门用于数据挖掘的开源Python库,它以Numpy为基础,借力Numpy模块在计算方面性能高的优势,又基于Matplotlib,可以简便的画图,而且还拥有自己独特的数据结构
- Pandas=Panel+data+analysis
在学习完Numpy和Matplotlib后还要学习Pandas的原因在于:Pandas纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需要的工具,也提供了大量使我们能够快速处理数据的函数和方法。具体来说:
-
Pandas 可以从各种文件格式比如 CSV、JSON、SQL、Microsoft Excel 导入数据。
-
Pandas 可以对各种数据进行运算操作,比如归并、再成形、选择,还有数据清洗和数据加工特征。
-
Pandas 广泛应用在学术、金融、统计学等各个数据分析领域
- 自行查阅,安装非常简单
安装好之后,可以通过下面的语句导入Pandas库以及查看其是否能够正常运行
import pandas as pd
mydataset = {
'sites': ["Google", "Runoob", "Wiki"],
'number': [1, 2, 3]
}
myvar = pd.DataFrame(mydataset)
print(myvar)
(4)Pandas核心数据结构
在Pandas中有两类数据结构
- Series:是一种类似于一维数组的对象,它由一组数据(各种Numpy数据类型)以及一组与之相关的数据标签(即索引)组成;它可以保存不同种类的数据类型
- DataFrame:是一个表格型的数据结构(Excel、SQL等),它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型值)。DataFrame 既有行索引也有列索引,它可以被看做由 Series 组成的字典(共同用一个索引)
Numpy注重运算,所以对于数据意义的表达没有那么清楚,比如下面用Numpy生成了一个符号正态分布的10支股票5天的涨幅情况
- 这样的数据表现形式让人有点难受,因为完全不知道它在表达什么
stock_change = np.random.normal(0, 1, (10, 5)) print(stock_change) [[ 0.22129238 1.72192263 0.49808165 -0.70501369 -0.57315298] [-0.05685967 -1.59493883 0.20770355 2.03934052 -0.91647225] [-0.64659703 -1.7586049 -0.53091496 -0.95453855 0.84446516] [ 0.02877987 1.53110344 -0.90623823 1.41938924 -1.24248129] [-0.36990152 -0.17153907 0.24179436 0.82450977 1.1865927 ] [-0.14524005 -0.57297533 -0.08680693 0.07105316 -0.12050658] [ 0.50399736 1.56385492 -0.38175291 0.52144963 0.51322901] [ 0.71534998 -0.61644881 0.15437358 0.00324533 -0.830954 ] [-0.65036464 -1.71639338 -1.18670887 0.34092581 -0.8870423 ] [-0.89061683 -0.93671895 -0.19911303 0.49350255 2.02240886]]
因此,我们的DataFrame就是为了让数据更有意义的显示。这里可以直接调用pd.DataFrame(),然后将numpy数组传入进去
stock_change = np.random.normal(0, 1, (10, 5)) a = pd.DataFrame(stock_change) print(a)
你会发现,现在显示形式比之前就舒服多了
(1)DataFrame结构DataFrame 是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型值)。DataFrame 既有行索引也有列索引,它可以被看做由 Series 组成的字典(共同用一个索引)
因此,上面的那个例子中行列索引表达的意思为
(2)DataFrame构造方法DataFrame 构造格式下:
pandas.DataFrame( data, index, columns, dtype, copy)
-
data:一组数据(ndarray、series, map, lists, dict 等类型)。
-
index:索引值,或者可以称为行标签。
-
columns:列标签,默认为 RangeIndex (0, 1, 2, …, n) 。
-
dtype:数据类型。
-
copy:拷贝数据,默认为 False
举例
a = pd.DataFrame(np.random.randn(4, 5)) # numpy二维随机数组 print(a)
从以上输出结果可以知道, DataFrame 数据类型一个表格,包含 rows(行) 和 columns(列)
上例中默认显示的索引并不是很合适,没有起到见名知意的作用。我的目的是行索引显示股票支数,列索引显示天数,这里先用列表生成式生成行索引
stock_index = ["股票{}".format(i) for i in range(10)] # 行索引
然后在刚才的pd.DataFrame()中传入index=stock_index,即行索引
stock_change = np.random.normal(0, 1, (10, 5))
stock_index = ["股票{}".format(i) for i in range(10)] # 行索引
a = pd.DataFrame(stock_change, index=stock_index)
print(a)
对于列索引,我们直接调用Pandas中现成的函数
- 关于date_range()更为详细的用法可以参照这篇文章点击跳转
date_index = pd.date_range(start='20220510', periods=5, freq='B') #列索引
然后在刚才的pd.DataFrame()中传入columns=date_index,即列索引
stock_change = np.random.normal(0, 1, (10, 5))
stock_index = ["股票{}".format(i) for i in range(10)] # 行索引
date_index = pd.date_range(start='20220510', periods=5, freq='B') # 列索引
a = pd.DataFrame(stock_change, index=stock_index, columns=date_index)
print(a)
B:其他操作(先看第 (4)再看这个)
①:修改行列索引值
- 特别注意:在Pandas中,索引是不支持单独修改的,也即,类似于DataFrame.index[2] = '×××'这样的操作是不支持的,只能整体修改
修改时,只需对其index属性重新赋值即可
stock_change = np.random.normal(0, 1, (10, 5))
stock_index = ["股票{}".format(i) for i in range(10)] # 行索引(旧)
stock_index_new = ["第{}支股票".format(j) for j in range(10)] # 行索引(新)
date_index = pd.date_range(start='20220510', periods=5, freq='B') # 列索引
a = pd.DataFrame(stock_change, index=stock_index, columns=date_index)
a.index = stock_index_new # 更换索引
print(a)
②:重设索引
使用DataFrame.reset_index(drop=False)可以重设索引
- 如果drop=False:则不会删除原来索引
- 如果drop=True:则会删除原来的索引
stock_change = np.random.normal(0, 1, (3, 5))
stock_index = ["股票{}".format(i) for i in range(3)] # 行索引(旧)
date_index = pd.date_range(start='20220510', periods=5, freq='B') # 列索引
a = pd.DataFrame(stock_change, index=stock_index, columns=date_index)
print(a) # 原始情况
print("-"*20)
b = a.reset_index() # 重设索引,且不删除原来索引
print(b)
print("-"*20)
c = a.reset_index(drop=True) # 重设索引,且删除原来索引
print(c)
③:使用字典设置索引
在设置索引时,还可以传入字典,如下
a = pd.DataFrame(
{
"month": [1, 4, 7, 10],
"year": [2012, 2014, 2013, 2020],
"sale": [55, 40, 84, 31]
}
)
print(a)
④:把某列设置为新的索引
在Pandas中使用set_index(keys, drop=True)可以把某个列直接设置为索引
- keys:表示列索引名或者列索引名称的列表
- drop:是一个布尔类型,默认为True,表示当该列做新的索引时会删除原来的列
a = pd.DataFrame(
{
"month": [1, 4, 7, 10],
"year": [2012, 2014, 2013, 2020],
"sale": [55, 40, 84, 31]
}
)
print("原始")
print(a)
print("-"*20)
print('''把"month"设置为新的索引,并删除原来的列''')
b = a.set_index('month')
print(b)
print("-"*20)
print('''把"month"和"year"设置为新的索引,并删除原来的列''')
c = a.set_index(['month', 'year'])
print(c)
结果为
原始
month year sale
0 1 2012 55
1 4 2014 40
2 7 2013 84
3 10 2020 31
--------------------
把"month"设置为新的索引,并删除原来的列
year sale
month
1 2012 55
4 2014 40
7 2013 84
10 2020 31
--------------------
把"month"和"year"设置为新的索引,并删除原来的列
sale
month year
1 2012 55
4 2014 40
7 2013 84
10 2020 31
Process finished with exit code 0
如果某个DataFrame设置了多个索引,那么它的索引就叫做MulitIndex。例如上面的例子中我们为其设定了month和year两个索引,然后查看其index属性
a = pd.DataFrame(
{
"month": [1, 4, 7, 10],
"year": [2012, 2014, 2013, 2020],
"sale": [55, 40, 84, 31]
}
)
print('''把"month"和"year"设置为新的索引,并删除原来的列''')
b = a.set_index(['month', 'year'])
print(b)
print("-"*20)
print(b.index)
实际上,拥有MulitIndex的DataFrame是可以存储三维数据的
MulitIndex内含属性如下
- names:levels的名称
- levels:每个levels的元组值
print(b.index.names) print(b.index.nlevels)
Pandas中有用于处理三维数组的结构Pandas,其对应的索引就是MulitIndex,但是Pandas目前已经把这种结构给移除了,而是采用带MulitIndex的DataFrame去处理三维数组
(4)DateFrame常用属性和方法 A:属性DateFrame说穿了其实就是Numpy二维数组加了行列索引,所以Numpy数组具有的属性,DateFrame基本也有,常用属性有
stock_change = np.random.normal(0, 1, (10, 5))
stock_index = ["股票{}".format(i) for i in range(10)] # 行索引
date_index = pd.date_range(start='20220510', periods=5, freq='B') # 列索引
a = pd.DataFrame(stock_change, index=stock_index, columns=date_index)
print(a.shape) # 形状
print("-"*20)
print(a.index) # 返回DateFrame行索引列表
print("-"*20)
print(a.columns) # 返回DateFrame列索引列表
print("-"*20)
print(type(a.values)) # 返回原生Numpy数组
print("-"*20)
B:方法
如果我们要频繁查看表的头部和尾部信息,可以使用head()和tail()
stock_change = np.random.normal(0, 1, (10, 5))
stock_index = ["股票{}".format(i) for i in range(10)] # 行索引
date_index = pd.date_range(start='20220510', periods=5, freq='B') # 列索引
a = pd.DataFrame(stock_change, index=stock_index, columns=date_index)
print(a.head(3)) # 查看前三只股表信息
print("-"*20)
print(a.tail(2)) # 查看后两只股票信息
如果要获取DataFrame中某个股票的不同时间数据,可以使用 DataFrame.iloc();其实这本质就是Numpy中的切片操作
stock_change = np.random.normal(0, 1, (10, 5))
stock_index = ["股票{}".format(i) for i in range(10)] # 行索引
date_index = pd.date_range(start='20220510', periods=5, freq='B') # 列索引
a = pd.DataFrame(stock_change, index=stock_index, columns=date_index)
print(a)
print("-"*20)
print(a.iloc[1:3, 1:3])
#########################结果##################################################
2022-05-10 2022-05-11 2022-05-12 2022-05-13 2022-05-16
股票0 -0.030529 0.491926 0.599494 0.292252 0.436244
股票1 -1.213430 0.278960 -0.442035 0.941825 0.036534
股票2 -0.921940 0.236212 -0.649530 0.621479 0.094708
股票3 0.416826 -0.643720 -0.471491 0.240899 0.704580
股票4 -0.156581 -1.027308 0.837797 -0.360443 0.187924
股票5 1.546736 -0.420407 0.876887 1.499043 0.026667
股票6 -0.026673 -0.061860 1.136667 -0.748732 -1.584693
股票7 -1.183476 0.444513 -2.143341 -0.456710 1.423592
股票8 0.264159 -0.659765 1.366594 -0.981925 0.104557
股票9 -0.073674 0.211402 0.016598 -1.600371 1.405910
--------------------
2022-05-11 2022-05-12
股票1 0.278960 -0.442035
股票2 0.236212 -0.649530
三:Series类型
(1)Series结构与创建
Series 类似表格中的一个列(column),是一种带索引(只有行索引)的一维数组,或者说DataFrame是Series的容器,格式如下
pandas.Series( data, index, dtype, name, copy)
-
data:一组数据(ndarray 类型)
-
index:数据索引标签,如果不指定,默认从 0 开始
-
dtype:数据类型,默认会自己判断
-
name:设置名称
-
copy:拷贝数据,默认为 False
例如
a = pd.Series([1, 3, 'str', np.nan, 7], index=['A', 'B', 'C', 'D', 'E'])
print(a)
print("-"*20)
print(a['C'])
注意:可以使用pandas.index.name来为索引列起一个名字
a = pd.Series([1, 3, 'str', np.nan, 7], index=['A', 'B', 'C', 'D', 'E'])
print(a)
print("-"*20)
a.index.name = '索引'
print(a)



