这是一个Pandas快速入门教程,主要面向新用户。 这里主要是为那些喜欢“短平快”的读者准备的,有兴趣的读者可通过其它教程文章来一步一步地更复杂的应用知识。
首先,假设您安装好了 Pandas。
测试工作环境是否有安装好了Pandas,导入相关包如下:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
注意,以上是在数据科学中的常见导入形式.
Pandas处理以下三个数据结构 :
- 系列(Series)
- 数据帧(DataFrame)
- 面板(Panel)
面板数据,即Panel Data,也叫“平行数据”,是指在时间序列上取多个截面,在这些截面上同时选取样本观测值所构成的样本数据。或者说他是一个m*n的数据矩阵,记载的是n个时间节点上,m个对象的某一数据指标。
这些数据结构构建在Numpy数组之上,这意味着它们很快。
考虑这些数据结构的最好方法是,较高维数据结构是其较低维数据结构的容器。 例如,DataFrame是Series的容器,Panel是DataFrame的容器。
数据结构 | 维数 | 描述 |
---|---|---|
系列 | 1 | 1 D标记均匀数组,大小不变。 |
数据帧 | 2 | 一般2 D标记,大小可变的表结构与潜在的异质类型的列。 |
面板 | 3 | 一般3 D标记,大小可变数组。 |
构建和处理二维或更高维度的数组是一项繁琐的任务,用户在编写函数时要考虑数据集的数轴方向。 但是使用Pandas数据结构,减少了用户的思考时间。
例如,使用表格数据(DataFrame),在语义上更有用于考虑索引(行)和列,而不是 轴0
和 轴1
。
可变性
所有Pandas数据结构是值可变的(可以更改);除了系列都是大小可变的,系列是大小不变的。
注 - DataFrame被广泛使用,是最重要的数据结构之一。面板使用少得多。
系列是具有均匀数据的一维数组结构。例如,以下系列是整数:10,23,56,...的集合。
关键点
- 均匀数据
- 尺寸大小不变
- 数据的值可变
数据帧(DataFrame)是一个具有异构数据的二维数组。 例如,
姓名 | 年龄 | 性别 | 等级 |
---|---|---|---|
Maxsu | 25 | 男 | 4.45 |
Katie | 34 | 女 | 2.78 |
Vina | 46 | 女 | 3.9 |
Lia | 女 | x女 | 4.6 |
上表表示具有整体绩效评级组织的销售团队的数据。数据以行和列表示。每列表示一个属性,每行代表一个人。
列的数据类型
上面数据帧中四列的数据类型如下:
列 | 类型 |
---|---|
姓名 | 字符串 |
年龄 | 整数 |
性别 | 字符串 |
等级 | 浮点型 |
关键点
- 异构数据
- 大小可变
- 数据可变
s = pd.Series([1,3,5,np.nan,6,8])
s
0 1.0 1 3.0 2 5.0 3 NaN 4 6.0 5 8.0 dtype: float64
通过传递 Numpy 数组,使用datetime索引和标记列来创建DataFrame:
dates = pd.date_range('20210101', periods=7)
dates
DatetimeIndex(['2021-01-01', '2021-01-02', '2021-01-03', '2021-01-04', '2021-01-05', '2021-01-06', '2021-01-07'], dtype='datetime64[ns]', freq='D')
df = pd.DataFrame(np.random.randn(7,4), index=dates, columns=list('ABCD'))
df
A | B | C | D | |
---|---|---|---|---|
2021-01-01 | -1.142112 | 0.203232 | -0.290131 | -2.098333 |
2021-01-02 | -0.227914 | 1.352863 | -1.591199 | -1.315098 |
2021-01-03 | 0.502071 | -0.121993 | -0.795380 | 0.839260 |
2021-01-04 | 0.371620 | 1.042893 | 0.313662 | 0.190671 |
2021-01-05 | -1.750997 | -0.247502 | 0.669875 | -0.696786 |
2021-01-06 | -0.526955 | -0.022440 | 0.408443 | 0.746906 |
2021-01-07 | -0.559759 | 0.251471 | 0.125035 | -0.512629 |
通过传递可以转换为类似系列的对象的字典来创建DataFrame。参考以下示例代码 -
df2 = pd.DataFrame({ 'A' : 1.,
'B' : pd.Timestamp('20170102'),
'C' : pd.Series(1,index=list(range(4)),dtype='float32'),
'D' : np.array([3] * 4,dtype='int32'),
'E' : pd.Categorical(["test","train","test","train"]),
'F' : 'foo' })
df2
A | B | C | D | E | F | |
---|---|---|---|---|---|---|
0 | 1.0 | 2017-01-02 | 1.0 | 3 | test | foo |
1 | 1.0 | 2017-01-02 | 1.0 | 3 | train | foo |
2 | 1.0 | 2017-01-02 | 1.0 | 3 | test | foo |
3 | 1.0 | 2017-01-02 | 1.0 | 3 | train | foo |
有指定dtypes,参考以下示例代码 -
df2.dtypes
A float64 B datetime64[s] C float32 D int32 E category F object dtype: object
如果使用 IPython 、 Jupyter notebook 等工具,则会自动启用列名(以及公共属性)的 Tab 补全完成
df.head()
A | B | C | D | |
---|---|---|---|---|
2021-01-01 | -1.142112 | 0.203232 | -0.290131 | -2.098333 |
2021-01-02 | -0.227914 | 1.352863 | -1.591199 | -1.315098 |
2021-01-03 | 0.502071 | -0.121993 | -0.795380 | 0.839260 |
2021-01-04 | 0.371620 | 1.042893 | 0.313662 | 0.190671 |
2021-01-05 | -1.750997 | -0.247502 | 0.669875 | -0.696786 |
df.tail(3)
A | B | C | D | |
---|---|---|---|---|
2021-01-05 | -1.750997 | -0.247502 | 0.669875 | -0.696786 |
2021-01-06 | -0.526955 | -0.022440 | 0.408443 | 0.746906 |
2021-01-07 | -0.559759 | 0.251471 | 0.125035 | -0.512629 |
显示索引,列和底层numpy数据,参考以下代码 -
print("index is :" )
df.index
index is :
DatetimeIndex(['2021-01-01', '2021-01-02', '2021-01-03', '2021-01-04', '2021-01-05', '2021-01-06', '2021-01-07'], dtype='datetime64[ns]', freq='D')
print("columns is :" )
df.columns
columns is :
Index(['A', 'B', 'C', 'D'], dtype='object')
print("values is :" )
df.values
values is :
array([[-1.14211233, 0.20323164, -0.29013072, -2.09833313], [-0.22791399, 1.35286276, -1.59119908, -1.31509773], [ 0.50207081, -0.12199328, -0.79538013, 0.83926032], [ 0.37162023, 1.0428925 , 0.31366187, 0.19067139], [-1.75099728, -0.2475025 , 0.66987451, -0.69678566], [-0.52695519, -0.02243974, 0.40844324, 0.74690551], [-0.55975932, 0.25147083, 0.12503525, -0.51262891]])
描述显示数据的快速统计摘要,参考以下示例代码 -
df.describe()
A | B | C | D | |
---|---|---|---|---|
count | 7.000000 | 7.000000 | 7.000000 | 7.000000 |
mean | -0.476292 | 0.351217 | -0.165671 | -0.406573 |
std | 0.797451 | 0.610406 | 0.794373 | 1.081839 |
min | -1.750997 | -0.247502 | -1.591199 | -2.098333 |
25% | -0.850936 | -0.072217 | -0.542755 | -1.005942 |
50% | -0.526955 | 0.203232 | 0.125035 | -0.512629 |
75% | 0.071853 | 0.647182 | 0.361053 | 0.468788 |
max | 0.502071 | 1.352863 | 0.669875 | 0.839260 |
调换数据,参考以下示例代码 -
dates3 = pd.date_range('20170101', periods=6)
df3 = pd.DataFrame(np.random.randn(6,4), index=dates3, columns=list('ABCD'))
df3.T
2017-01-01 | 2017-01-02 | 2017-01-03 | 2017-01-04 | 2017-01-05 | 2017-01-06 | |
---|---|---|---|---|---|---|
A | 1.268122 | 0.170006 | 0.174132 | 0.667923 | -1.038522 | 0.151073 |
B | -0.798343 | -1.550316 | 1.861018 | -0.172522 | -1.426658 | -1.286962 |
C | 1.694286 | 0.126599 | 0.405659 | -0.885641 | 1.542105 | 1.726969 |
D | 1.154201 | -0.328597 | -0.505734 | 1.351454 | 0.698298 | 1.764092 |
通过轴排序,参考以下示例程序 -
df3.sort_index(axis=1, ascending=False)
D | C | B | A | |
---|---|---|---|---|
2017-01-01 | 1.154201 | 1.694286 | -0.798343 | 1.268122 |
2017-01-02 | -0.328597 | 0.126599 | -1.550316 | 0.170006 |
2017-01-03 | -0.505734 | 0.405659 | 1.861018 | 0.174132 |
2017-01-04 | 1.351454 | -0.885641 | -0.172522 | 0.667923 |
2017-01-05 | 0.698298 | 1.542105 | -1.426658 | -1.038522 |
2017-01-06 | 1.764092 | 1.726969 | -1.286962 | 0.151073 |
按值排序,参考以下示例程序 -
df3.sort_values(by='B')
A | B | C | D | |
---|---|---|---|---|
2017-01-02 | 0.170006 | -1.550316 | 0.126599 | -0.328597 |
2017-01-05 | -1.038522 | -1.426658 | 1.542105 | 0.698298 |
2017-01-06 | 0.151073 | -1.286962 | 1.726969 | 1.764092 |
2017-01-01 | 1.268122 | -0.798343 | 1.694286 | 1.154201 |
2017-01-04 | 0.667923 | -0.172522 | -0.885641 | 1.351454 |
2017-01-03 | 0.174132 | 1.861018 | 0.405659 | -0.505734 |
import pandas as pd
import numpy as np
dates = pd.date_range('20170101', periods=6)
df = pd.DataFrame(np.random.randn(6,4), index=dates, columns=list('ABCD'))
选择通过 []
操作符,选择切片行。参考以下示例程序 :
df['A']
2017-01-01 -0.851001 2017-01-02 0.413902 2017-01-03 2.605852 2017-01-04 0.212162 2017-01-05 -0.136684 2017-01-06 -0.505396 Freq: D, Name: A, dtype: float64
df.A
2017-01-01 -0.851001 2017-01-02 0.413902 2017-01-03 2.605852 2017-01-04 0.212162 2017-01-05 -0.136684 2017-01-06 -0.505396 Freq: D, Name: A, dtype: float64
print(df[0:3])
print("========= 指定选择日期 ========")
print(df['20170102':'20170103'])
A B C D 2017-01-01 -0.851001 0.644580 -0.075751 0.919224 2017-01-02 0.413902 -1.430253 -0.849136 0.167283 2017-01-03 2.605852 0.840580 0.403373 1.389634 ========= 指定选择日期 ======== A B C D 2017-01-02 0.413902 -1.430253 -0.849136 0.167283 2017-01-03 2.605852 0.840580 0.403373 1.389634
df.loc[dates[0]]
A -0.851001 B 0.644580 C -0.075751 D 0.919224 Name: 2017-01-01 00:00:00, dtype: float64
通过标签选择多轴,参考以下示例程序 -
df.loc[:,['A','B']]
A | B | |
---|---|---|
2017-01-01 | -0.851001 | 0.644580 |
2017-01-02 | 0.413902 | -1.430253 |
2017-01-03 | 2.605852 | 0.840580 |
2017-01-04 | 0.212162 | -1.115089 |
2017-01-05 | -0.136684 | 0.009475 |
2017-01-06 | -0.505396 | -0.666401 |
显示标签切片,包括两个端点,参考以下示例程序 -
df.loc['20170102':'20170104',['A','B']]
A | B | |
---|---|---|
2017-01-02 | 0.413902 | -1.430253 |
2017-01-03 | 2.605852 | 0.840580 |
2017-01-04 | 0.212162 | -1.115089 |
减少返回对象的尺寸(大小),参考以下示例程序 -
df.loc['20170102',['A','B']]
A 0.413902 B -1.430253 Name: 2017-01-02 00:00:00, dtype: float64
获得标量值,参考以下示例程序 -
import pandas as pd
import numpy as np
dates = pd.date_range('20170101', periods=6)
df = pd.DataFrame(np.random.randn(6,4), index=dates, columns=list('ABCD'))
print(df.loc[dates[0],'A'])
-0.8085854217432723
快速访问标量(等同于先前的方法),参考以下示例程序 -
import pandas as pd
import numpy as np
dates = pd.date_range('20170101', periods=6)
df = pd.DataFrame(np.random.randn(6,4), index=dates, columns=list('ABCD'))
print(df.at[dates[0],'A'])
0.7014447733051447
import pandas as pd
import numpy as np
dates = pd.date_range('20170101', periods=6)
df = pd.DataFrame(np.random.randn(6,4), index=dates, columns=list('ABCD'))
print(df.iloc[3])
A 0.909519 B -0.316695 C -0.644218 D -0.137582 Name: 2017-01-04 00:00:00, dtype: float64
通过整数切片,类似于numpy/python,参考以下示例程序 -
import pandas as pd
import numpy as np
dates = pd.date_range('20170101', periods=6)
df = pd.DataFrame(np.random.randn(6,4), index=dates, columns=list('ABCD'))
print(df.iloc[3:5,0:2])
A B 2017-01-04 1.407653 0.858472 2017-01-05 1.071373 1.882958
通过整数位置的列表,类似于numpy/python样式,参考以下示例程序 -
import pandas as pd
import numpy as np
dates = pd.date_range('20170101', periods=6)
df = pd.DataFrame(np.random.randn(6,4), index=dates, columns=list('ABCD'))
print(df.iloc[[1,2,4],[0,2]])
A C 2017-01-02 0.252070 1.582681 2017-01-03 0.729146 -1.109823 2017-01-05 2.360024 1.060174
明确切片行,参考以下示例程序 -
import pandas as pd
import numpy as np
dates = pd.date_range('20170101', periods=6)
df = pd.DataFrame(np.random.randn(6,4), index=dates, columns=list('ABCD'))
print(df.iloc[1:3,:])
A B C D 2017-01-02 1.553603 0.762347 -0.648448 -2.572604 2017-01-03 -0.139522 0.668654 0.981006 0.308984
明确切片列,参考以下示例程序 -
import pandas as pd
import numpy as np
dates = pd.date_range('20170101', periods=6)
df = pd.DataFrame(np.random.randn(6,4), index=dates, columns=list('ABCD'))
print(df.iloc[:,1:3])
B C 2017-01-01 -0.496598 -2.318647 2017-01-02 0.391543 0.820100 2017-01-03 0.156743 0.661117 2017-01-04 -1.869448 -0.542534 2017-01-05 1.036090 0.345114 2017-01-06 -0.599288 0.280096
要明确获取值,参考以下示例程序 -
import pandas as pd
import numpy as np
dates = pd.date_range('20170101', periods=6)
df = pd.DataFrame(np.random.randn(6,4), index=dates, columns=list('ABCD'))
print(df.iloc[1,1])
0.11560710791613786
要快速访问标量(等同于先前的方法),参考以下示例程序 -
import pandas as pd
import numpy as np
dates = pd.date_range('20170101', periods=6)
df = pd.DataFrame(np.random.randn(6,4), index=dates, columns=list('ABCD'))
print(df.iat[1,1])
1.4906936498174008
import pandas as pd
import numpy as np
dates = pd.date_range('20170101', periods=6)
df = pd.DataFrame(np.random.randn(6,4), index=dates, columns=list('ABCD'))
print(df[df.A > 0])
A B C D 2017-01-03 1.088799 1.479232 0.247733 -0.56371
从满足布尔条件的DataFrame中选择值。参考以下示例程序 -
import pandas as pd
import numpy as np
dates = pd.date_range('20170101', periods=6)
df = pd.DataFrame(np.random.randn(6,4), index=dates, columns=list('ABCD'))
print(df[df > 0])
A B C D 2017-01-01 NaN 0.870990 NaN NaN 2017-01-02 0.229135 NaN NaN NaN 2017-01-03 NaN NaN 1.170391 0.786013 2017-01-04 NaN 1.408249 NaN 1.679434 2017-01-05 1.185091 1.542335 NaN 1.204475 2017-01-06 0.631233 0.630588 NaN 0.088279
使用 isin()
方法进行过滤,参考以下示例程序:
import pandas as pd
import numpy as np
dates = pd.date_range('20170101', periods=6)
df = pd.DataFrame(np.random.randn(6,4), index=dates, columns=list('ABCD'))
df2 = df.copy()
df2['E'] = ['one', 'one','two','three','four','three']
print(df2)
print("============= start to filter =============== ")
print(df2[df2['E'].isin(['two','four'])])
A B C D E 2017-01-01 -1.137943 0.023689 1.065112 0.522517 one 2017-01-02 2.085374 0.538823 1.441752 -0.644961 one 2017-01-03 -1.361291 -1.260829 0.272873 0.674704 two 2017-01-04 -0.453061 1.141351 -1.436514 1.015764 three 2017-01-05 -0.127324 1.809703 -0.596540 1.419329 four 2017-01-06 1.753627 -0.282690 0.759724 0.759128 three ============= start to filter =============== A B C D E 2017-01-03 -1.361291 -1.260829 0.272873 0.674704 two 2017-01-05 -0.127324 1.809703 -0.596540 1.419329 four