Pandas快速入门?慢速入门
pandas(Python Data Analysis Library) 是基于NumPy的数据分析模块,提供了大量标准数据模型和高效操作大型数据集所需要的工具,可以说pandas是使得Python能够成为高效且强大的数据分析环境的重要因素之一。
pandas主要提供了3种数据结构:
- Series,带标签的一维数组
- DataFrame,带标签且大小可变的二维表格结构
- Panel,带标签且大小可变的三维数组
可以在命令提示符环境使用pip工具下载和安装pandas,然后按照Python社区的习惯导入该模块
import pandas as pd
生成一维数组
- 用值列表生成 Series 时,Pandas 默认自动生成整数索引
import numpy as np
x=pd.Series([1,3,5,np.nan])
x
0 1.0
1 3.0
2 5.0
3 NaN
dtype: float64
生成二维数组
- 用含日期时间索引与标签的 NumPy 数组生成 DataFrame
pandas.date_range(start=None, end=None, periods=None, freq=None, tz=None, normalize=False, name=None, closed=None, **kwargs)
此函数返回一个固定频率的DatetimeIndex类型的数据(就是返回一个时间序列)
参数说明:
start
:生成日期序列的左区间,str或datetime-like类型, 参数可选。
end
: 生成日期序列的右区间,str或datetime-like类型, 参数可选。
periods
:要生成的周期数,周期是指生成的序列的长度, int整型, 参数可选。
freq
:要生成的日期的频次, 频次是指两个相邻日期间隔时间, 可以是5小时:“5H”, 1天:“D”, 3个月:"3M"等等
tz
:时区,返回所选时区的日期时间,如:‘Asia/Hong_Kong’,默认生成的日期序列与时区无关,str类型,参数可选。
normalize
:在生成日期序列之前,将start/end标准化为午夜。 bool类型,默认False。
name
: 生成的DatetimeIndex序列的名字, str类型,默认None。
closed
:左右日期区间是否闭合可取。‘left’:左闭右开,‘right’:左开右闭。默认:None, 左右都是闭区间。
**kwargs
:向后兼容性考虑,对结果没有影响。
dates = pd.date_range(start='20200101',end='20201231',freq='D') # 间隔为天
dates
DatetimeIndex(['2020-01-01', '2020-01-02', '2020-01-03', '2020-01-04',
'2020-01-05', '2020-01-06', '2020-01-07', '2020-01-08',
'2020-01-09', '2020-01-10',
...
'2020-12-22', '2020-12-23', '2020-12-24', '2020-12-25',
'2020-12-26', '2020-12-27', '2020-12-28', '2020-12-29',
'2020-12-30', '2020-12-31'],
dtype='datetime64[ns]', length=366, freq='D')
dates = pd.date_range(start='20200101',end='20201231',freq='M') # 间隔为月
dates
DatetimeIndex(['2020-01-31', '2020-02-29', '2020-03-31', '2020-04-30',
'2020-05-31', '2020-06-30', '2020-07-31', '2020-08-31',
'2020-09-30', '2020-10-31', '2020-11-30', '2020-12-31'],
dtype='datetime64[ns]', freq='M')
- DataFrame的构造
(data=None, index: Optional[Collection] = None, columns: Optional[Collection] = None, dtype: Union[str, numpy.dtype, ExtensionDtype, None] = None, copy: bool = False)
属性 | 说明 |
---|---|
T | 转置索引和列。 |
at | 访问行/列标签对的单个值。 |
attrs | 此对象的全局属性字典。 |
axes | 返回一个表示DataFrame轴的列表。 |
columns | DataFrame的列标签。 |
dtypes | 返回DataFrame中的dtype。 |
empty | 指示DataFrame是否为空。 |
iat | 通过整数位置访问行/列对的单个值。 |
iloc | 基于位置的纯基于整数位置的索引。 |
index | DataFrame的索引(行标签)。 |
loc | 通过标签或布尔数组访问一组行和列。 |
ndim | 返回一个表示轴数/数组维数的整数。 |
shape | 返回一个表示DataFrame维数的元组。 |
size | 返回一个表示此对象中元素数量的int。 |
style | 返回一个Styler对象。 |
values | 返回DataFrame的Numpy表示形式。 |
# 通过(np.random.randn(12,4)生成12行4列的随机数据填充到对应列columns=xxx,对应行index=xxx
df=pd.DataFrame(np.random.randn(12,4),index=dates,columns=list('ABCD')) # 4列随机数
df
A | B | C | D | |
---|---|---|---|---|
2020-01-31 | 0.103044 | 0.560109 | 2.091236 | 0.229528 |
2020-02-29 | -0.240959 | 0.797532 | -1.296197 | 2.061426 |
2020-03-31 | -0.922652 | -0.514413 | 1.412822 | -0.299704 |
2020-04-30 | -0.490586 | 0.891507 | -0.198199 | -0.622861 |
2020-05-31 | 0.393078 | -0.139235 | -1.454866 | -0.195723 |
2020-06-30 | -0.665946 | -0.465771 | -0.706536 | -1.066117 |
2020-07-31 | 0.022426 | 0.589539 | -0.792461 | 1.051375 |
2020-08-31 | -0.279077 | -1.277658 | -0.836739 | -0.668070 |
2020-09-30 | 0.281047 | -2.080861 | 0.291808 | -0.735833 |
2020-10-31 | -0.389757 | 0.803638 | -0.678899 | 1.033629 |
2020-11-30 | -1.108762 | -0.236067 | -0.238890 | -0.536497 |
2020-12-31 | 1.014580 | 0.508034 | -0.594122 | 0.847084 |
df=pd.DataFrame([[np.random.randint(1,100) for j in range(4)] for i in range(12)],index=dates,columns=list('ABCD'))
df
A | B | C | D | |
---|---|---|---|---|
2020-01-31 | 54 | 35 | 88 | 2 |
2020-02-29 | 84 | 84 | 95 | 43 |
2020-03-31 | 32 | 72 | 41 | 70 |
2020-04-30 | 53 | 1 | 15 | 66 |
2020-05-31 | 59 | 81 | 83 | 11 |
2020-06-30 | 73 | 89 | 85 | 3 |
2020-07-31 | 87 | 52 | 27 | 35 |
2020-08-31 | 3 | 30 | 69 | 77 |
2020-09-30 | 8 | 29 | 28 | 31 |
2020-10-31 | 62 | 44 | 22 | 25 |
2020-11-30 | 65 | 49 | 70 | 90 |
2020-12-31 | 41 | 86 | 20 | 25 |
- 用 Series 字典对象生成 DataFrame:
下面的代码包括了多种产生数据的方式
df=pd.DataFrame({'A':[np.random.randint(1,100) for i in range(4)],
'B':pd.date_range(start='20200101',periods=4,freq='D'),
'C':pd.Series([1,2,3,4],index=list(range(4)),dtype='float32'),
'D':np.array([3]*4,dtype='int32'),
'E':pd.Categorical(["test","train","test","train"]),
'F':'foo'
})
df
A | B | C | D | E | F | |
---|---|---|---|---|---|---|
0 | 57 | 2020-01-01 | 1.0 | 3 | test | foo |
1 | 34 | 2020-01-02 | 2.0 | 3 | train | foo |
2 | 81 | 2020-01-03 | 3.0 | 3 | test | foo |
3 | 58 | 2020-01-04 | 4.0 | 3 | train | foo |
df2 = pd.DataFrame({'A': 1.,
'B': pd.Timestamp('20130102'),
'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 | 2013-01-02 | 1.0 | 3 | test | foo |
1 | 1.0 | 2013-01-02 | 1.0 | 3 | train | foo |
2 | 1.0 | 2013-01-02 | 1.0 | 3 | test | foo |
3 | 1.0 | 2013-01-02 | 1.0 | 3 | train | foo |
DataFrame 的列有不同数据类型
df2.dtypes
A float64
B datetime64[ns]
C float32
D int32
E category
F object
dtype: object
二维数据(DataFrame)的查看与操作
- 下列代码说明如何查看 DataFrame 头部和尾部数据:
df.head() # 默认显示前五行数据
A | B | C | D | |
---|---|---|---|---|
2020-01-31 | 0.103044 | 0.560109 | 2.091236 | 0.229528 |
2020-02-29 | -0.240959 | 0.797532 | -1.296197 | 2.061426 |
2020-03-31 | -0.922652 | -0.514413 | 1.412822 | -0.299704 |
2020-04-30 | -0.490586 | 0.891507 | -0.198199 | -0.622861 |
2020-05-31 | 0.393078 | -0.139235 | -1.454866 | -0.195723 |
df.tail(3) #显示最后3行数据
A | B | C | D | |
---|---|---|---|---|
2020-10-31 | -0.389757 | 0.803638 | -0.678899 | 1.033629 |
2020-11-30 | -1.108762 | -0.236067 | -0.238890 | -0.536497 |
2020-12-31 | 1.014580 | 0.508034 | -0.594122 | 0.847084 |
- 显示索引与列名:
df.index
DatetimeIndex(['2020-01-31', '2020-02-29', '2020-03-31', '2020-04-30',
'2020-05-31', '2020-06-30', '2020-07-31', '2020-08-31',
'2020-09-30', '2020-10-31', '2020-11-30', '2020-12-31'],
dtype='datetime64[ns]', freq='M')
- DataFrame.to_numpy() 输出底层数据的 NumPy 对象。
注意,DataFrame 的列由多种数据类型组成时,该操作耗费系统资源较大,这也是 Pandas 和 NumPy 的本质区别:NumPy 数组只有一种数据类型,DataFrame 每列的数据类型各不相同。
调用 DataFrame.to_numpy() 时,Pandas 查找支持 DataFrame 里所有数据类型的 NumPy 数据类型。还有一种数据类型是 object,可以把 DataFrame 列里的值强制转换为 Python 对象。
下面的 df 这个 DataFrame 里的值都是浮点数,DataFrame.to_numpy() 的操作会很快,而且不复制数据。
df.to_numpy()
array([[ 0.1030443 , 0.56010851, 2.09123565, 0.22952782],
[-0.240959 , 0.79753185, -1.29619662, 2.06142599],
[-0.92265174, -0.51441274, 1.41282217, -0.29970364],
[-0.49058649, 0.89150696, -0.19819928, -0.6228611 ],
[ 0.39307835, -0.13923532, -1.4548656 , -0.19572281],
[-0.66594582, -0.46577126, -0.70653569, -1.06611748],
[ 0.02242613, 0.58953907, -0.79246131, 1.05137516],
[-0.27907671, -1.27765827, -0.83673938, -0.66807027],
[ 0.28104749, -2.08086105, 0.29180758, -0.73583295],
[-0.38975678, 0.80363846, -0.67889905, 1.03362933],
[-1.10876246, -0.23606694, -0.23888969, -0.53649743],
[ 1.01458035, 0.50803353, -0.59412216, 0.84708401]])
df2 这个 DataFrame 包含了多种类型,DataFrame.to_numpy() 操作就会耗费较多资源。
注意: DataFrame.to_numpy() 的输出不包含行索引和列标签。
df2.to_numpy()
array([[1.0, Timestamp('2013-01-02 00:00:00'), 1.0, 3, 'test', 'foo'],
[1.0, Timestamp('2013-01-02 00:00:00'), 1.0, 3, 'train', 'foo'],
[1.0, Timestamp('2013-01-02 00:00:00'), 1.0, 3, 'test', 'foo'],
[1.0, Timestamp('2013-01-02 00:00:00'), 1.0, 3, 'train', 'foo']],
dtype=object)
- describe() 可以快速查看数据的统计摘要:
df.describe()
A | B | C | D | |
---|---|---|---|---|
count | 12.000000 | 12.000000 | 12.000000 | 12.000000 |
mean | -0.190297 | -0.046971 | -0.250087 | 0.091520 |
std | 0.594833 | 0.928765 | 1.054785 | 0.954476 |
min | -1.108762 | -2.080861 | -1.454866 | -1.066117 |
25% | -0.534426 | -0.477932 | -0.803531 | -0.634163 |
50% | -0.260018 | 0.184399 | -0.636511 | -0.247713 |
75% | 0.147545 | 0.641537 | -0.075698 | 0.893720 |
max | 1.014580 | 0.891507 | 2.091236 | 2.061426 |
- 转置数据:
df.T
2020-01-31 | 2020-02-29 | 2020-03-31 | 2020-04-30 | 2020-05-31 | 2020-06-30 | 2020-07-31 | 2020-08-31 | 2020-09-30 | 2020-10-31 | 2020-11-30 | 2020-12-31 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
A | 0.103044 | -0.240959 | -0.922652 | -0.490586 | 0.393078 | -0.665946 | 0.022426 | -0.279077 | 0.281047 | -0.389757 | -1.108762 | 1.014580 |
B | 0.560109 | 0.797532 | -0.514413 | 0.891507 | -0.139235 | -0.465771 | 0.589539 | -1.277658 | -2.080861 | 0.803638 | -0.236067 | 0.508034 |
C | 2.091236 | -1.296197 | 1.412822 | -0.198199 | -1.454866 | -0.706536 | -0.792461 | -0.836739 | 0.291808 | -0.678899 | -0.238890 | -0.594122 |
D | 0.229528 | 2.061426 | -0.299704 | -0.622861 | -0.195723 | -1.066117 | 1.051375 | -0.668070 | -0.735833 | 1.033629 | -0.536497 | 0.847084 |
- 按轴排序:
df.sort_index(axis=1,ascending=False) # 对列(column)排序,降序
D | C | B | A | |
---|---|---|---|---|
2020-01-31 | 0.229528 | 2.091236 | 0.560109 | 0.103044 |
2020-02-29 | 2.061426 | -1.296197 | 0.797532 | -0.240959 |
2020-03-31 | -0.299704 | 1.412822 | -0.514413 | -0.922652 |
2020-04-30 | -0.622861 | -0.198199 | 0.891507 | -0.490586 |
2020-05-31 | -0.195723 | -1.454866 | -0.139235 | 0.393078 |
2020-06-30 | -1.066117 | -0.706536 | -0.465771 | -0.665946 |
2020-07-31 | 1.051375 | -0.792461 | 0.589539 | 0.022426 |
2020-08-31 | -0.668070 | -0.836739 | -1.277658 | -0.279077 |
2020-09-30 | -0.735833 | 0.291808 | -2.080861 | 0.281047 |
2020-10-31 | 1.033629 | -0.678899 | 0.803638 | -0.389757 |
2020-11-30 | -0.536497 | -0.238890 | -0.236067 | -1.108762 |
2020-12-31 | 0.847084 | -0.594122 | 0.508034 | 1.014580 |
df.sort_index(axis=0,ascending=False) # 对行(索引)排序,降序
A | B | C | D | |
---|---|---|---|---|
2020-12-31 | 1.014580 | 0.508034 | -0.594122 | 0.847084 |
2020-11-30 | -1.108762 | -0.236067 | -0.238890 | -0.536497 |
2020-10-31 | -0.389757 | 0.803638 | -0.678899 | 1.033629 |
2020-09-30 | 0.281047 | -2.080861 | 0.291808 | -0.735833 |
2020-08-31 | -0.279077 | -1.277658 | -0.836739 | -0.668070 |
2020-07-31 | 0.022426 | 0.589539 | -0.792461 | 1.051375 |
2020-06-30 | -0.665946 | -0.465771 | -0.706536 | -1.066117 |
2020-05-31 | 0.393078 | -0.139235 | -1.454866 | -0.195723 |
2020-04-30 | -0.490586 | 0.891507 | -0.198199 | -0.622861 |
2020-03-31 | -0.922652 | -0.514413 | 1.412822 | -0.299704 |
2020-02-29 | -0.240959 | 0.797532 | -1.296197 | 2.061426 |
2020-01-31 | 0.103044 | 0.560109 | 2.091236 | 0.229528 |
- 按值排序:
df.sort_values(by='B') # 对B列排序,默认为升序
A | B | C | D | |
---|---|---|---|---|
2020-09-30 | 0.281047 | -2.080861 | 0.291808 | -0.735833 |
2020-08-31 | -0.279077 | -1.277658 | -0.836739 | -0.668070 |
2020-03-31 | -0.922652 | -0.514413 | 1.412822 | -0.299704 |
2020-06-30 | -0.665946 | -0.465771 | -0.706536 | -1.066117 |
2020-11-30 | -1.108762 | -0.236067 | -0.238890 | -0.536497 |
2020-05-31 | 0.393078 | -0.139235 | -1.454866 | -0.195723 |
2020-12-31 | 1.014580 | 0.508034 | -0.594122 | 0.847084 |
2020-01-31 | 0.103044 | 0.560109 | 2.091236 | 0.229528 |
2020-07-31 | 0.022426 | 0.589539 | -0.792461 | 1.051375 |
2020-02-29 | -0.240959 | 0.797532 | -1.296197 | 2.061426 |
2020-10-31 | -0.389757 | 0.803638 | -0.678899 | 1.033629 |
2020-04-30 | -0.490586 | 0.891507 | -0.198199 | -0.622861 |
按多列排序
df.sort_values(by=['A', 'B'],ascending=False)
A | B | C | D | |
---|---|---|---|---|
2020-12-31 | 1.014580 | 0.508034 | -0.594122 | 0.847084 |
2020-05-31 | 0.393078 | -0.139235 | -1.454866 | -0.195723 |
2020-09-30 | 0.281047 | -2.080861 | 0.291808 | -0.735833 |
2020-01-31 | 0.103044 | 0.560109 | 2.091236 | 0.229528 |
2020-07-31 | 0.022426 | 0.589539 | -0.792461 | 1.051375 |
2020-02-29 | -0.240959 | 0.797532 | -1.296197 | 2.061426 |
2020-08-31 | -0.279077 | -1.277658 | -0.836739 | -0.668070 |
2020-10-31 | -0.389757 | 0.803638 | -0.678899 | 1.033629 |
2020-04-30 | -0.490586 | 0.891507 | -0.198199 | -0.622861 |
2020-06-30 | -0.665946 | -0.465771 | -0.706536 | -1.066117 |
2020-03-31 | -0.922652 | -0.514413 | 1.412822 | -0.299704 |
2020-11-30 | -1.108762 | -0.236067 | -0.238890 | -0.536497 |
选择
官方提示:
选择、设置标准 Python / Numpy 的表达式已经非常直观,交互也很方便,但对于生产代码,我们还是推荐优化过的 Pandas 数据访问方法:.at、.iat、.loc 和 .iloc。
获取数据
- 选择单列,产生 Series,与 df.A 等效:
df['A']
2020-01-31 0.103044
2020-02-29 -0.240959
2020-03-31 -0.922652
2020-04-30 -0.490586
2020-05-31 0.393078
2020-06-30 -0.665946
2020-07-31 0.022426
2020-08-31 -0.279077
2020-09-30 0.281047
2020-10-31 -0.389757
2020-11-30 -1.108762
2020-12-31 1.014580
Freq: M, Name: A, dtype: float64
df.A
2020-01-31 0.103044
2020-02-29 -0.240959
2020-03-31 -0.922652
2020-04-30 -0.490586
2020-05-31 0.393078
2020-06-30 -0.665946
2020-07-31 0.022426
2020-08-31 -0.279077
2020-09-30 0.281047
2020-10-31 -0.389757
2020-11-30 -1.108762
2020-12-31 1.014580
Freq: M, Name: A, dtype: float64
- 用 [ ] 切片行:
df[0:3] # 获得第1~3行的数据,还是左闭右开
A | B | C | D | |
---|---|---|---|---|
2020-01-31 | 0.103044 | 0.560109 | 2.091236 | 0.229528 |
2020-02-29 | -0.240959 | 0.797532 | -1.296197 | 2.061426 |
2020-03-31 | -0.922652 | -0.514413 | 1.412822 | -0.299704 |
df['20200331':'20200731'] # 通过切索引也可以获得对应行数据
A | B | C | D | |
---|---|---|---|---|
2020-03-31 | -0.922652 | -0.514413 | 1.412822 | -0.299704 |
2020-04-30 | -0.490586 | 0.891507 | -0.198199 | -0.622861 |
2020-05-31 | 0.393078 | -0.139235 | -1.454866 | -0.195723 |
2020-06-30 | -0.665946 | -0.465771 | -0.706536 | -1.066117 |
2020-07-31 | 0.022426 | 0.589539 | -0.792461 | 1.051375 |
按标签选择
- 用标签提取一行数据
df.loc[dates[0]]
A 0.103044
B 0.560109
C 2.091236
D 0.229528
Name: 2020-01-31 00:00:00, dtype: float64
- 用标签选择多列数据:
df.loc[:,['A','B']]
A | B | |
---|---|---|
2020-01-31 | 0.103044 | 0.560109 |
2020-02-29 | -0.240959 | 0.797532 |
2020-03-31 | -0.922652 | -0.514413 |
2020-04-30 | -0.490586 | 0.891507 |
2020-05-31 | 0.393078 | -0.139235 |
2020-06-30 | -0.665946 | -0.465771 |
2020-07-31 | 0.022426 | 0.589539 |
2020-08-31 | -0.279077 | -1.277658 |
2020-09-30 | 0.281047 | -2.080861 |
2020-10-31 | -0.389757 | 0.803638 |
2020-11-30 | -1.108762 | -0.236067 |
2020-12-31 | 1.014580 | 0.508034 |
- 用标签切片,包含行与列结束点:
df.loc['20200331':'20200511',['A','B']] # 记得之前在NumPy创建数组时总结过,切片或定义时行和列是用','分开的
A | B | |
---|---|---|
2020-03-31 | -0.922652 | -0.514413 |
2020-04-30 | -0.490586 | 0.891507 |
- 返回对象降维:
df.loc['20200131',['A','B']]
A 0.103044
B 0.560109
Name: 2020-01-31 00:00:00, dtype: float64
- 提取标量值:
df.loc[dates[0],'A'] # 获得'0'行'A'列的标量值,即数据矩阵中(0,0)的值
0.10304429743799953
- 快速访问标量,与上述方法等效:
df.at[dates[0],'A']
0.10304429743799953
按位置选择
- 用整数位置选择:
df.iloc[3] # 第4行的数据
A -0.490586
B 0.891507
C -0.198199
D -0.622861
Name: 2020-04-30 00:00:00, dtype: float64
- 类似 NumPy / Python,用整数切片:
df.iloc[3:5,0:2]
A | B | |
---|---|---|
2020-04-30 | -0.490586 | 0.891507 |
2020-05-31 | 0.393078 | -0.139235 |
- 类似 NumPy / Python,用整数列表按位置切片:
df.iloc[[1,2,4],[0,2]]
A | C | |
---|---|---|
2020-02-29 | -0.240959 | -1.296197 |
2020-03-31 | -0.922652 | 1.412822 |
2020-05-31 | 0.393078 | -1.454866 |
- 显式整行切片:
df.iloc[1:3,:]
A | B | C | D | |
---|---|---|---|---|
2020-02-29 | -0.240959 | 0.797532 | -1.296197 | 2.061426 |
2020-03-31 | -0.922652 | -0.514413 | 1.412822 | -0.299704 |
- 显式整列切片:
df.iloc[:,1:3]
B | C | |
---|---|---|
2020-01-31 | 0.560109 | 2.091236 |
2020-02-29 | 0.797532 | -1.296197 |
2020-03-31 | -0.514413 | 1.412822 |
2020-04-30 | 0.891507 | -0.198199 |
2020-05-31 | -0.139235 | -1.454866 |
2020-06-30 | -0.465771 | -0.706536 |
2020-07-31 | 0.589539 | -0.792461 |
2020-08-31 | -1.277658 | -0.836739 |
2020-09-30 | -2.080861 | 0.291808 |
2020-10-31 | 0.803638 | -0.678899 |
2020-11-30 | -0.236067 | -0.238890 |
2020-12-31 | 0.508034 | -0.594122 |
- 显式提取值:
df.iloc[1,1] # 第二行二列的标量值
0.7975318527696976
- 快速访问标量,与上述方法等效:
df.iat[1, 1]
0.7975318527696976
转载:https://blog.csdn.net/qq_41819729/article/details/105590819