飞道的博客

Pandas快速入门?慢速入门

302人阅读  评论(0)

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轴的列表。
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
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场