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 | 0.001486 | -0.307184 | 0.754324 | -1.837935 |
2021-01-02 | -0.461419 | -1.003486 | -2.610638 | -0.545688 |
2021-01-03 | 0.591955 | -0.064618 | -1.586581 | 0.475643 |
2021-01-04 | -0.516069 | -2.057979 | -0.932186 | -0.079409 |
2021-01-05 | 0.393721 | -0.244816 | -0.871661 | 0.162636 |
2021-01-06 | -0.031920 | -0.174145 | 1.959957 | -0.470215 |
2021-01-07 | 0.506832 | -0.798270 | -0.340508 | 0.115066 |
通过传递可以转换为类似系列的对象的字典来创建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 | 0.001486 | -0.307184 | 0.754324 | -1.837935 |
2021-01-02 | -0.461419 | -1.003486 | -2.610638 | -0.545688 |
2021-01-03 | 0.591955 | -0.064618 | -1.586581 | 0.475643 |
2021-01-04 | -0.516069 | -2.057979 | -0.932186 | -0.079409 |
2021-01-05 | 0.393721 | -0.244816 | -0.871661 | 0.162636 |
df.tail(3)
A | B | C | D | |
---|---|---|---|---|
2021-01-05 | 0.393721 | -0.244816 | -0.871661 | 0.162636 |
2021-01-06 | -0.031920 | -0.174145 | 1.959957 | -0.470215 |
2021-01-07 | 0.506832 | -0.798270 | -0.340508 | 0.115066 |
显示索引,列和底层 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.48631914e-03, -3.07183557e-01, 7.54324123e-01, -1.83793499e+00], [-4.61418943e-01, -1.00348622e+00, -2.61063761e+00, -5.45688226e-01], [ 5.91954964e-01, -6.46175035e-02, -1.58658058e+00, 4.75643403e-01], [-5.16069125e-01, -2.05797893e+00, -9.32185841e-01, -7.94089586e-02], [ 3.93721382e-01, -2.44815919e-01, -8.71661468e-01, 1.62635605e-01], [-3.19202570e-02, -1.74145292e-01, 1.95995689e+00, -4.70215258e-01], [ 5.06832423e-01, -7.98270413e-01, -3.40508076e-01, 1.15065596e-01]])
描述显示数据的快速统计摘要,参考以下示例代码:
df.describe()
A | B | C | D | |
---|---|---|---|---|
count | 7.000000 | 7.000000 | 7.000000 | 7.000000 |
mean | 0.069227 | -0.664357 | -0.518185 | -0.311415 |
std | 0.448890 | 0.704593 | 1.505999 | 0.762699 |
min | -0.516069 | -2.057979 | -2.610638 | -1.837935 |
25% | -0.246670 | -0.900878 | -1.259383 | -0.507952 |
50% | 0.001486 | -0.307184 | -0.871661 | -0.079409 |
75% | 0.450277 | -0.209481 | 0.206908 | 0.138851 |
max | 0.591955 | -0.064618 | 1.959957 | 0.475643 |
调换数据,参考以下示例代码:
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.267059 | -0.184584 | 0.589480 | -0.419801 | -0.358220 | 0.494729 |
B | -2.194387 | 2.225664 | -0.563670 | -0.170876 | -1.560443 | -2.005858 |
C | 0.213999 | 0.505457 | -0.233044 | -1.887898 | -1.371057 | 1.691990 |
D | 1.414600 | 1.168010 | -0.682595 | 0.167517 | -1.455432 | 0.533370 |
通过轴排序,参考以下示例程序:
df3.sort_index(axis=1, ascending=False)
D | C | B | A | |
---|---|---|---|---|
2017-01-01 | 1.414600 | 0.213999 | -2.194387 | -1.267059 |
2017-01-02 | 1.168010 | 0.505457 | 2.225664 | -0.184584 |
2017-01-03 | -0.682595 | -0.233044 | -0.563670 | 0.589480 |
2017-01-04 | 0.167517 | -1.887898 | -0.170876 | -0.419801 |
2017-01-05 | -1.455432 | -1.371057 | -1.560443 | -0.358220 |
2017-01-06 | 0.533370 | 1.691990 | -2.005858 | 0.494729 |
按值排序,参考以下示例程序:
df3.sort_values(by='B')
A | B | C | D | |
---|---|---|---|---|
2017-01-01 | -1.267059 | -2.194387 | 0.213999 | 1.414600 |
2017-01-06 | 0.494729 | -2.005858 | 1.691990 | 0.533370 |
2017-01-05 | -0.358220 | -1.560443 | -1.371057 | -1.455432 |
2017-01-03 | 0.589480 | -0.563670 | -0.233044 | -0.682595 |
2017-01-04 | -0.419801 | -0.170876 | -1.887898 | 0.167517 |
2017-01-02 | -0.184584 | 2.225664 | 0.505457 | 1.168010 |
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.332355 2017-01-02 0.845689 2017-01-03 -1.147840 2017-01-04 0.769853 2017-01-05 -1.689689 2017-01-06 0.285145 Freq: D, Name: A, dtype: float64
df.A
2017-01-01 -0.332355 2017-01-02 0.845689 2017-01-03 -1.147840 2017-01-04 0.769853 2017-01-05 -1.689689 2017-01-06 0.285145 Freq: D, Name: A, dtype: float64
print(df[0:3])
A B C D 2017-01-01 -0.332355 1.132306 1.359775 1.334344 2017-01-02 0.845689 0.301752 -0.232830 1.447188 2017-01-03 -1.147840 -0.151422 0.249274 0.677520
print("========= 指定选择日期 ========")
========= 指定选择日期 ========
print(df['20170102':'20170103'])
A B C D 2017-01-02 0.845689 0.301752 -0.232830 1.447188 2017-01-03 -1.147840 -0.151422 0.249274 0.677520
df.loc[dates[0]]
A -0.332355 B 1.132306 C 1.359775 D 1.334344 Name: 2017-01-01 00:00:00, dtype: float64
通过标签选择多轴,参考以下示例程序:
df.loc[:,['A','B']]
A | B | |
---|---|---|
2017-01-01 | -0.332355 | 1.132306 |
2017-01-02 | 0.845689 | 0.301752 |
2017-01-03 | -1.147840 | -0.151422 |
2017-01-04 | 0.769853 | -0.979920 |
2017-01-05 | -1.689689 | -1.124846 |
2017-01-06 | 0.285145 | 0.225813 |
显示标签切片,包括两个端点,参考以下示例程序:
df.loc['20170102':'20170104',['A','B']]
A | B | |
---|---|---|
2017-01-02 | 0.845689 | 0.301752 |
2017-01-03 | -1.147840 | -0.151422 |
2017-01-04 | 0.769853 | -0.979920 |
减少返回对象的尺寸(大小),参考以下示例程序:
df.loc['20170102',['A','B']]
A 0.845689 B 0.301752 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'])
1.0933465069048087
快速访问标量(等同于先前的方法),参考以下示例程序:
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.07537533485395147
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 -2.933957 B 0.345513 C -1.042180 D 0.671278 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.410426 -0.362692 2017-01-05 -0.110475 -1.434446
通过整数位置的列表,类似于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.367730 -1.311476 2017-01-03 -0.743540 -1.020191 2017-01-05 0.801609 -2.459102
明确切片行,参考以下示例程序:
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.704104 -2.027060 -0.852729 -0.910503 2017-01-03 -0.897462 1.031799 -1.037823 -0.356108
明确切片列,参考以下示例程序:
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.448208 -1.515635 2017-01-02 0.500852 0.824269 2017-01-03 -0.890080 0.088131 2017-01-04 -0.929702 -0.561355 2017-01-05 0.183911 0.927580 2017-01-06 1.362603 1.891298
要明确获取值,参考以下示例程序:
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.127429328270751
要快速访问标量(等同于先前的方法),参考以下示例程序:
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])
-0.6578884078666973
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-02 0.580450 1.022204 -0.263625 -0.949446 2017-01-03 1.530471 0.355306 0.216696 0.109686 2017-01-05 1.637938 1.684846 0.646526 -0.459107 2017-01-06 0.491655 0.812724 -0.320930 -1.213702
从满足布尔条件的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 0.108569 NaN NaN NaN 2017-01-02 NaN 0.297957 0.753290 0.353729 2017-01-03 NaN 1.511663 1.549131 1.903229 2017-01-04 2.407813 NaN NaN 0.763003 2017-01-05 NaN NaN 0.554087 NaN 2017-01-06 NaN 0.540657 NaN NaN
使用 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)
A B C D E 2017-01-01 2.606448 -0.342062 -0.888814 -0.986434 one 2017-01-02 -0.457198 0.929366 0.445749 -1.472747 one 2017-01-03 -0.505486 -0.201993 1.193571 1.536547 two 2017-01-04 0.101350 -2.702856 -0.195869 -0.338227 three 2017-01-05 -0.943293 0.135593 -0.844466 0.656606 four 2017-01-06 0.904835 -0.301786 -0.049963 0.622156 three
print("============= start to filter =============== ")
============= start to filter ===============
print(df2[df2['E'].isin(['two','four'])])
A B C D E 2017-01-03 -0.505486 -0.201993 1.193571 1.536547 two 2017-01-05 -0.943293 0.135593 -0.844466 0.656606 four