Pandas快速入门?慢速入门_上篇

Pandas快速入门?慢速入门

参考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轴的列表。
columnsDataFrame的列标签。
dtypes返回DataFrame中的dtype。
empty指示DataFrame是否为空。
iat通过整数位置访问行/列对的单个值。
iloc基于位置的纯基于整数位置的索引。
indexDataFrame的索引(行标签)。
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
ABCD
2020-01-310.1030440.5601092.0912360.229528
2020-02-29-0.2409590.797532-1.2961972.061426
2020-03-31-0.922652-0.5144131.412822-0.299704
2020-04-30-0.4905860.891507-0.198199-0.622861
2020-05-310.393078-0.139235-1.454866-0.195723
2020-06-30-0.665946-0.465771-0.706536-1.066117
2020-07-310.0224260.589539-0.7924611.051375
2020-08-31-0.279077-1.277658-0.836739-0.668070
2020-09-300.281047-2.0808610.291808-0.735833
2020-10-31-0.3897570.803638-0.6788991.033629
2020-11-30-1.108762-0.236067-0.238890-0.536497
2020-12-311.0145800.508034-0.5941220.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
ABCD
2020-01-315435882
2020-02-2984849543
2020-03-3132724170
2020-04-305311566
2020-05-3159818311
2020-06-307389853
2020-07-3187522735
2020-08-313306977
2020-09-308292831
2020-10-3162442225
2020-11-3065497090
2020-12-3141862025
  • 用 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
ABCDEF
0572020-01-011.03testfoo
1342020-01-022.03trainfoo
2812020-01-033.03testfoo
3582020-01-044.03trainfoo
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
ABCDEF
01.02013-01-021.03testfoo
11.02013-01-021.03trainfoo
21.02013-01-021.03testfoo
31.02013-01-021.03trainfoo

DataFrame 的列有不同数据类型

df2.dtypes
A           float64
B    datetime64[ns]
C           float32
D             int32
E          category
F            object
dtype: object

二维数据(DataFrame)的查看与操作

  • 下列代码说明如何查看 DataFrame 头部和尾部数据:
df.head() # 默认显示前五行数据
ABCD
2020-01-310.1030440.5601092.0912360.229528
2020-02-29-0.2409590.797532-1.2961972.061426
2020-03-31-0.922652-0.5144131.412822-0.299704
2020-04-30-0.4905860.891507-0.198199-0.622861
2020-05-310.393078-0.139235-1.454866-0.195723
df.tail(3) #显示最后3行数据
ABCD
2020-10-31-0.3897570.803638-0.6788991.033629
2020-11-30-1.108762-0.236067-0.238890-0.536497
2020-12-311.0145800.508034-0.5941220.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()
ABCD
count12.00000012.00000012.00000012.000000
mean-0.190297-0.046971-0.2500870.091520
std0.5948330.9287651.0547850.954476
min-1.108762-2.080861-1.454866-1.066117
25%-0.534426-0.477932-0.803531-0.634163
50%-0.2600180.184399-0.636511-0.247713
75%0.1475450.641537-0.0756980.893720
max1.0145800.8915072.0912362.061426
  • 转置数据:
df.T
2020-01-312020-02-292020-03-312020-04-302020-05-312020-06-302020-07-312020-08-312020-09-302020-10-312020-11-302020-12-31
A0.103044-0.240959-0.922652-0.4905860.393078-0.6659460.022426-0.2790770.281047-0.389757-1.1087621.014580
B0.5601090.797532-0.5144130.891507-0.139235-0.4657710.589539-1.277658-2.0808610.803638-0.2360670.508034
C2.091236-1.2961971.412822-0.198199-1.454866-0.706536-0.792461-0.8367390.291808-0.678899-0.238890-0.594122
D0.2295282.061426-0.299704-0.622861-0.195723-1.0661171.051375-0.668070-0.7358331.033629-0.5364970.847084
df.sort_index(axis=1,ascending=False) # 对列(column)排序,降序
DCBA
2020-01-310.2295282.0912360.5601090.103044
2020-02-292.061426-1.2961970.797532-0.240959
2020-03-31-0.2997041.412822-0.514413-0.922652
2020-04-30-0.622861-0.1981990.891507-0.490586
2020-05-31-0.195723-1.454866-0.1392350.393078
2020-06-30-1.066117-0.706536-0.465771-0.665946
2020-07-311.051375-0.7924610.5895390.022426
2020-08-31-0.668070-0.836739-1.277658-0.279077
2020-09-30-0.7358330.291808-2.0808610.281047
2020-10-311.033629-0.6788990.803638-0.389757
2020-11-30-0.536497-0.238890-0.236067-1.108762
2020-12-310.847084-0.5941220.5080341.014580
df.sort_index(axis=0,ascending=False) # 对行(索引)排序,降序
ABCD
2020-12-311.0145800.508034-0.5941220.847084
2020-11-30-1.108762-0.236067-0.238890-0.536497
2020-10-31-0.3897570.803638-0.6788991.033629
2020-09-300.281047-2.0808610.291808-0.735833
2020-08-31-0.279077-1.277658-0.836739-0.668070
2020-07-310.0224260.589539-0.7924611.051375
2020-06-30-0.665946-0.465771-0.706536-1.066117
2020-05-310.393078-0.139235-1.454866-0.195723
2020-04-30-0.4905860.891507-0.198199-0.622861
2020-03-31-0.922652-0.5144131.412822-0.299704
2020-02-29-0.2409590.797532-1.2961972.061426
2020-01-310.1030440.5601092.0912360.229528
df.sort_values(by='B') # 对B列排序,默认为升序
ABCD
2020-09-300.281047-2.0808610.291808-0.735833
2020-08-31-0.279077-1.277658-0.836739-0.668070
2020-03-31-0.922652-0.5144131.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-310.393078-0.139235-1.454866-0.195723
2020-12-311.0145800.508034-0.5941220.847084
2020-01-310.1030440.5601092.0912360.229528
2020-07-310.0224260.589539-0.7924611.051375
2020-02-29-0.2409590.797532-1.2961972.061426
2020-10-31-0.3897570.803638-0.6788991.033629
2020-04-30-0.4905860.891507-0.198199-0.622861

按多列排序

df.sort_values(by=['A', 'B'],ascending=False) 
ABCD
2020-12-311.0145800.508034-0.5941220.847084
2020-05-310.393078-0.139235-1.454866-0.195723
2020-09-300.281047-2.0808610.291808-0.735833
2020-01-310.1030440.5601092.0912360.229528
2020-07-310.0224260.589539-0.7924611.051375
2020-02-29-0.2409590.797532-1.2961972.061426
2020-08-31-0.279077-1.277658-0.836739-0.668070
2020-10-31-0.3897570.803638-0.6788991.033629
2020-04-30-0.4905860.891507-0.198199-0.622861
2020-06-30-0.665946-0.465771-0.706536-1.066117
2020-03-31-0.922652-0.5144131.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行的数据,还是左闭右开
ABCD
2020-01-310.1030440.5601092.0912360.229528
2020-02-29-0.2409590.797532-1.2961972.061426
2020-03-31-0.922652-0.5144131.412822-0.299704
df['20200331':'20200731'] # 通过切索引也可以获得对应行数据
ABCD
2020-03-31-0.922652-0.5144131.412822-0.299704
2020-04-30-0.4905860.891507-0.198199-0.622861
2020-05-310.393078-0.139235-1.454866-0.195723
2020-06-30-0.665946-0.465771-0.706536-1.066117
2020-07-310.0224260.589539-0.7924611.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']]
AB
2020-01-310.1030440.560109
2020-02-29-0.2409590.797532
2020-03-31-0.922652-0.514413
2020-04-30-0.4905860.891507
2020-05-310.393078-0.139235
2020-06-30-0.665946-0.465771
2020-07-310.0224260.589539
2020-08-31-0.279077-1.277658
2020-09-300.281047-2.080861
2020-10-31-0.3897570.803638
2020-11-30-1.108762-0.236067
2020-12-311.0145800.508034
  • 用标签切片,包含行与列结束点:
df.loc['20200331':'20200511',['A','B']] # 记得之前在NumPy创建数组时总结过,切片或定义时行和列是用','分开的
AB
2020-03-31-0.922652-0.514413
2020-04-30-0.4905860.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]
AB
2020-04-30-0.4905860.891507
2020-05-310.393078-0.139235
  • 类似 NumPy / Python,用整数列表按位置切片:
df.iloc[[1,2,4],[0,2]]
AC
2020-02-29-0.240959-1.296197
2020-03-31-0.9226521.412822
2020-05-310.393078-1.454866
  • 显式整行切片:
df.iloc[1:3,:]
ABCD
2020-02-29-0.2409590.797532-1.2961972.061426
2020-03-31-0.922652-0.5144131.412822-0.299704
  • 显式整列切片:
df.iloc[:,1:3]
BC
2020-01-310.5601092.091236
2020-02-290.797532-1.296197
2020-03-31-0.5144131.412822
2020-04-300.891507-0.198199
2020-05-31-0.139235-1.454866
2020-06-30-0.465771-0.706536
2020-07-310.589539-0.792461
2020-08-31-1.277658-0.836739
2020-09-30-2.0808610.291808
2020-10-310.803638-0.678899
2020-11-30-0.236067-0.238890
2020-12-310.508034-0.594122
  • 显式提取值:
df.iloc[1,1] # 第二行二列的标量值
0.7975318527696976
  • 快速访问标量,与上述方法等效:
df.iat[1, 1]
0.7975318527696976
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值