Pyhton科学计算 - pandas库之数据查看、选择

本文详细介绍了Pandas库中的核心数据结构Series、DataFrame和Panel,展示了如何使用这些工具进行数据查看、选择和处理,适用于初学者和有经验的开发者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

pandas 是基于 Numpy 构建的,让以 Numpy 为中心的应用变得更加简单。

平台获取的数据主要是 DataFrame 的形式,它便是 pandas 中的。

除此之外,pandas 还包括 一位数组series 以及三维的Panel。

下面将进行详细介绍:

  • Series:一维数组,与Numpy中的一维array类似。二者与Python基本的数据结构List也很相近,其区别是:List中的元素可以是不同的数据类型,而Array和Series中则只允许存储相同的数据类型,这样可以更有效的使用内存,提高运算效率。

  • DataFrame:二维的表格型数据结构。很多功能与R中的data.frame类似。可以将DataFrame理解为Series的容器。以下的内容主要以DataFrame为主。

  • Panel :三维的数组,可以理解为DataFrame的容器。

Pandas官网,更多功能请参考http://pandas-docs.github.io/pandas-docs-travis/index.html

本节主要讲解 DataFrame 的数据查看与选择

In [84]:

# 首先导入库
import pandas as pd

1. Series

由一组数据(各种Numpy数据类型),以及一组与之相关的标签数据(即索引)组成。仅由一组数据即可产生最简单的Series,可以通过传递一个list对象来创建一个Series,pandas会默认创建整型索引,更多series内容请参考官网 http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.html

创建一个Series:

In [3]:

s = pd.Series([1,3,5,np.nan,6,8])
s

Out[3]:

0     1
1     3
2     5
3   NaN
4     6
5     8
dtype: float64

获取 Series 的索引:

In [4]:

s.index

Out[4]:

Int64Index([0, 1, 2, 3, 4, 5], dtype='int64')

由于 Series 的用法在后续的 DataFrame 讲解及涉及,所以这了不做过多介绍,精彩内容请往下看。

2. DataFrame

DataFrame是一个表格型的数据结构,它含有一组有序的列,每一列的数据结构都是相同的,而不同的列之间则可以是不同的数据结构(数值、字符、布尔值等)。或者以数据库进行类比,DataFrame中的每一行是一个记录,名称为Index的一个元素,而每一列则为一个字段,是这个记录的一个属性。DataFrame既有行索引也有列索引,可以被看做由Series组成的字典(共用同一个索引)。

更多内容请参考:http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.html

2.1 创建一个DataFrame,包括一个numpy array, 时间索引和列名字:

In [6]:

dates = pd.date_range('20130101',periods=6)
dates

Out[6]:

DatetimeIndex(['2013-01-01', '2013-01-02', '2013-01-03', '2013-01-04',
               '2013-01-05', '2013-01-06'],
              dtype='datetime64[ns]', freq='D', tz=None)

In [7]:

df = pd.DataFrame(np.random.randn(6,4),index=dates,columns=list('ABCD'))
df

Out[7]:

 ABCD
2013-01-010.9706001.034030-1.195059-1.202971
2013-01-020.5142101.4387180.983266-0.561351
2013-01-030.374372-0.9957140.4574190.801048
2013-01-04-1.806843-1.3076370.162970-1.051681
2013-01-05-0.056926-1.308821-1.128257-0.532996
2013-01-06-0.6068220.213184-1.159009-1.218311

In [13]:

df.<TAB>
  File "<ipython-input-13-8b5fccb86f33>", line 1
    df.<TAB>
       ^
SyntaxError: invalid syntax

2.2 查看数据 

我们以平台获取的数据为例进行讲解:

In [77]:

# 获取平安银行近几个工作日的开盘价、最高价、最低价、收盘价。
df = get_price('000001.XSHE',start_date='2016-07-01', end_date='2016-07-20', frequency='daily', fields=['open','high','low','close'])
df

Out[77]:

 openhighlowclose
2016-07-018.698.738.688.71
2016-07-048.698.868.678.81
2016-07-058.808.838.778.81
2016-07-068.808.828.768.79
2016-07-078.798.808.748.78
2016-07-088.798.798.738.74
2016-07-118.758.798.748.75
2016-07-128.758.898.748.88
2016-07-138.889.058.868.99
2016-07-148.979.008.918.94
2016-07-158.959.008.918.99
2016-07-188.999.088.979.04
2016-07-199.049.058.958.97
2016-07-208.968.998.958.96

查看前几条数据:

In [20]:

df.head()

Out[20]:

 openhighlowclose
2016-07-018.698.738.688.71
2016-07-048.698.868.678.81
2016-07-058.808.838.778.81
2016-07-068.808.828.768.79
2016-07-078.798.808.748.78

查看后几条数据:

In [21]:

df.tail()

Out[21]:

 openhighlowclose
2016-07-148.979.008.918.94
2016-07-158.959.008.918.99
2016-07-188.999.088.979.04
2016-07-199.049.058.958.97
2016-07-208.968.998.958.96

查看 DataFrame 的索引

In [22]:

df.index

Out[22]:

DatetimeIndex(['2016-07-01', '2016-07-04', '2016-07-05', '2016-07-06',
               '2016-07-07', '2016-07-08', '2016-07-11', '2016-07-12',
               '2016-07-13', '2016-07-14', '2016-07-15', '2016-07-18',
               '2016-07-19', '2016-07-20'],
              dtype='datetime64[ns]', freq=None, tz=None)

查看 DataFrame 的列名

In [23]:

df.columns

Out[23]:

Index([u'open', u'high', u'low', u'close'], dtype='object')

查看 DataFrame 的值

In [24]:

df.values

Out[24]:

array([[ 8.69,  8.73,  8.68,  8.71],
       [ 8.69,  8.86,  8.67,  8.81],
       [ 8.8 ,  8.83,  8.77,  8.81],
       [ 8.8 ,  8.82,  8.76,  8.79],
       [ 8.79,  8.8 ,  8.74,  8.78],
       [ 8.79,  8.79,  8.73,  8.74],
       [ 8.75,  8.79,  8.74,  8.75],
       [ 8.75,  8.89,  8.74,  8.88],
       [ 8.88,  9.05,  8.86,  8.99],
       [ 8.97,  9.  ,  8.91,  8.94],
       [ 8.95,  9.  ,  8.91,  8.99],
       [ 8.99,  9.08,  8.97,  9.04],
       [ 9.04,  9.05,  8.95,  8.97],
       [ 8.96,  8.99,  8.95,  8.96]])

使用 describe() 函数对于数据的快速统计汇总:

In [25]:

df.describe()

Out[25]:

 openhighlowclose
count14.00000014.00000014.00000014.000000
mean8.8464298.9057148.8128578.868571
std0.1164610.1180430.1070180.110722
min8.6900008.7300008.6700008.710000
25%8.7600008.8050008.7400008.782500
50%8.8000008.8750008.7650008.845000
75%8.9575009.0000008.9100008.967500
max9.0400009.0800008.9700009.040000

对数据的转置:

In [26]:

df.T

Out[26]:

 2016-07-01 00:00:002016-07-04 00:00:002016-07-05 00:00:002016-07-06 00:00:002016-07-07 00:00:002016-07-08 00:00:002016-07-11 00:00:002016-07-12 00:00:002016-07-13 00:00:002016-07-14 00:00:002016-07-15 00:00:002016-07-18 00:00:002016-07-19 00:00:002016-07-20 00:00:00
open8.698.698.808.808.798.798.758.758.888.978.958.999.048.96
high8.738.868.838.828.808.798.798.899.059.009.009.089.058.99
low8.688.678.778.768.748.738.748.748.868.918.918.978.958.95
close8.718.818.818.798.788.748.758.888.998.948.999.048.978.96

按列对 DataFrame 进行排序

In [28]:

df.sort(columns='open')

Out[28]:

 openhighlowclose
2016-07-018.698.738.688.71
2016-07-048.698.868.678.81
2016-07-118.758.798.748.75
2016-07-128.758.898.748.88
2016-07-078.798.808.748.78
2016-07-088.798.798.738.74
2016-07-058.808.838.778.81
2016-07-068.808.828.768.79
2016-07-138.889.058.868.99
2016-07-158.959.008.918.99
2016-07-208.968.998.958.96
2016-07-148.979.008.918.94
2016-07-188.999.088.979.04
2016-07-199.049.058.958.97

2.3 选择数据

2.3.1 通过下标选取数据:

df['open'],df.open

以上两个语句是等效的,都是返回 df 名称为 open 列的数据,返回的为一个 Series。

df[0:3], df['2016-07-05':'2016-07-08']

下标索引选取的是 DataFrame 的记录,与 List 相同 DataFrame 的下标也是从0开始,区间索引的话,为一个左闭右开的区间,即[0:3]选取的为0-2三条记录。

与此等价,还可以用起始的索引名称和结束索引名称选取数据,如:df['a':'b']。有一点需要注意的是使用起始索引名称和结束索引名称时,也会包含结束索引的数据。具体看下方示例:

以上两种方式返回的都是DataFrame。

选择一列数据:

In [37]:

df['open']

Out[37]:

2016-07-01    8.69
2016-07-04    8.69
2016-07-05    8.80
2016-07-06    8.80
2016-07-07    8.79
2016-07-08    8.79
2016-07-11    8.75
2016-07-12    8.75
2016-07-13    8.88
2016-07-14    8.97
2016-07-15    8.95
2016-07-18    8.99
2016-07-19    9.04
2016-07-20    8.96
Name: open, dtype: float64

选择多列数据:

In [31]:

df[['open','close']]

Out[31]:

 openclose
2016-07-018.698.71
2016-07-048.698.81
2016-07-058.808.81
2016-07-068.808.79
2016-07-078.798.78
2016-07-088.798.74
2016-07-118.758.75
2016-07-128.758.88
2016-07-138.888.99
2016-07-148.978.94
2016-07-158.958.99
2016-07-188.999.04
2016-07-199.048.97
2016-07-208.968.96

选择多行:

In [32]:

df[0:3]

Out[32]:

 openhighlowclose
2016-07-018.698.738.688.71
2016-07-048.698.868.678.81
2016-07-058.808.838.778.81

或者按 index 选取:

In [42]:

df['2016-07-05':'2016-07-08']

Out[42]:

 openhighlowclose
2016-07-058.808.838.778.81
2016-07-068.808.828.768.79
2016-07-078.798.808.748.78
2016-07-088.798.798.738.74

2.3.2 使用标签选取数据:

df.loc[行标签,列标签]

df.loc['a':'b'] #选取 ab 两行数据

df.loc[:,'open'] #选取 open 列的数据

df.loc 的第一个参数是行标签,第二个参数为列标签(可选参数,默认为所有列标签),两个参数既可以是列表也可以是单个字符,如果两个参数都为列表则返回的是 DataFrame,否则,则为 Series。

PS:loc为location的缩写。

In [44]:

df.loc['2016-07-05','open']

Out[44]:

8.8000000000000007

In [46]:

df.loc['2016-07-05':'2016-07-08']

Out[46]:

 openhighlowclose
2016-07-058.808.838.778.81
2016-07-068.808.828.768.79
2016-07-078.798.808.748.78
2016-07-088.798.798.738.74

In [47]:

df.loc[:, 'open']

Out[47]:

2016-07-01    8.69
2016-07-04    8.69
2016-07-05    8.80
2016-07-06    8.80
2016-07-07    8.79
2016-07-08    8.79
2016-07-11    8.75
2016-07-12    8.75
2016-07-13    8.88
2016-07-14    8.97
2016-07-15    8.95
2016-07-18    8.99
2016-07-19    9.04
2016-07-20    8.96
Name: open, dtype: float64

In [48]:

df.loc['2016-07-05':'2016-07-08','open']

Out[48]:

2016-07-05    8.80
2016-07-06    8.80
2016-07-07    8.79
2016-07-08    8.79
Name: open, dtype: float64

2.3.3. 使用位置选取数据:

df.iloc[行位置,列位置]

df.iloc[1,1] #选取第二行,第二列的值,返回的为单个值

df.iloc[[0,2],:] #选取第一行及第三行的数据

df.iloc[0:2,:] #选取第一行到第三行(不包含)的数据

df.iloc[:,1] #选取所有记录的第二列的值,返回的为一个Series

df.iloc[1,:] #选取第一行数据,返回的为一个Series

PS:iloc 则为 integer & location 的缩写

In [64]:

df

Out[64]:

 openhighlowclose
2016-07-018.698.738.688.71
2016-07-048.698.868.678.81
2016-07-058.808.838.778.81
2016-07-068.808.828.768.79
2016-07-078.798.808.748.78
2016-07-088.798.798.738.74
2016-07-118.758.798.748.75
2016-07-128.758.898.748.88
2016-07-138.889.058.868.99
2016-07-148.979.008.918.94
2016-07-158.959.008.918.99
2016-07-188.999.088.979.04
2016-07-199.049.058.958.97
2016-07-208.968.998.958.96

In [58]:

df.iloc[1,1] # 选取第二行,第二列的值,返回的为单个值

Out[58]:

8.8599999999999994

In [59]:

df.iloc[[0,2],:] # 选取第一行及第三行的数据

Out[59]:

 openhighlowclose
2016-07-018.698.738.688.71
2016-07-058.808.838.778.81

In [60]:

df.iloc[0:2,:] # 选取第一行到第三行(不包含)的数据

Out[60]:

 openhighlowclose
2016-07-018.698.738.688.71
2016-07-048.698.868.678.81

In [61]:

df.iloc[:,1] # 选取所有记录的第一列的值,返回的为一个Series

Out[61]:

2016-07-01    8.73
2016-07-04    8.86
2016-07-05    8.83
2016-07-06    8.82
2016-07-07    8.80
2016-07-08    8.79
2016-07-11    8.79
2016-07-12    8.89
2016-07-13    9.05
2016-07-14    9.00
2016-07-15    9.00
2016-07-18    9.08
2016-07-19    9.05
2016-07-20    8.99
Name: high, dtype: float64

In [57]:

df.iloc[1,:] # 选取第一行数据,返回的为一个Series

Out[57]:

open     8.69
high     8.86
low      8.67
close    8.81
Name: 2016-07-04 00:00:00, dtype: float64

2.3.4. 更广义的切片方式是使用.ix,它自动根据给到的索引类型判断是使用位置还是标签进行切片

df.ix[1,1]

df.ix['a':'b']

In [63]:

df

Out[63]:

 openhighlowclose
2016-07-018.698.738.688.71
2016-07-048.698.868.678.81
2016-07-058.808.838.778.81
2016-07-068.808.828.768.79
2016-07-078.798.808.748.78
2016-07-088.798.798.738.74
2016-07-118.758.798.748.75
2016-07-128.758.898.748.88
2016-07-138.889.058.868.99
2016-07-148.979.008.918.94
2016-07-158.959.008.918.99
2016-07-188.999.088.979.04
2016-07-199.049.058.958.97
2016-07-208.968.998.958.96

In [62]:

df.ix[1,1]

Out[62]:

8.8599999999999994

In [66]:

df.ix['2016-07-01':'2016-07-05']

Out[66]:

 openhighlowclose
2016-07-018.698.738.688.71
2016-07-048.698.868.678.81
2016-07-058.808.838.778.81

In [67]:

df.ix['2016-07-05','open']

Out[67]:

8.8000000000000007

In [68]:

df.ix[1,'open']

Out[68]:

8.6899999999999995

In [70]:

df.ix['2016-07-01',0]

Out[70]:

8.6899999999999995

2.3.5 通过逻辑指针进行数据切片:

df[逻辑条件]

df[df.one >= 2] #单个逻辑条件

df[(df.one >=1 ) & (df.one < 3) ] #多个逻辑条件组合

In [71]:

df

Out[71]:

 openhighlowclose
2016-07-018.698.738.688.71
2016-07-048.698.868.678.81
2016-07-058.808.838.778.81
2016-07-068.808.828.768.79
2016-07-078.798.808.748.78
2016-07-088.798.798.738.74
2016-07-118.758.798.748.75
2016-07-128.758.898.748.88
2016-07-138.889.058.868.99
2016-07-148.979.008.918.94
2016-07-158.959.008.918.99
2016-07-188.999.088.979.04
2016-07-199.049.058.958.97
2016-07-208.968.998.958.96

In [72]:

# 筛选出 open 大于 8.8 的数据
df[df.open > 8.8]

Out[72]:

 openhighlowclose
2016-07-138.889.058.868.99
2016-07-148.979.008.918.94
2016-07-158.959.008.918.99
2016-07-188.999.088.979.04
2016-07-199.049.058.958.97
2016-07-208.968.998.958.96

In [73]:

# 筛选出 open 大于 8.8 的数据,并且 close 小于 9.0 的数据
df[(df.open > 8.8) & (df.close < 9.0)]

Out[73]:

 openhighlowclose
2016-07-138.889.058.868.99
2016-07-148.979.008.918.94
2016-07-158.959.008.918.99
2016-07-199.049.058.958.97
2016-07-208.968.998.958.96

使用 条件过来更改数据。

In [79]:

df[df>9.0]

Out[79]:

 openhighlowclose
2016-07-01NaNNaNNaNNaN
2016-07-04NaNNaNNaNNaN
2016-07-05NaNNaNNaNNaN
2016-07-06NaNNaNNaNNaN
2016-07-07NaNNaNNaNNaN
2016-07-08NaNNaNNaNNaN
2016-07-11NaNNaNNaNNaN
2016-07-12NaNNaNNaNNaN
2016-07-13NaN9.05NaNNaN
2016-07-14NaNNaNNaNNaN
2016-07-15NaNNaNNaNNaN
2016-07-18NaN9.08NaN9.04
2016-07-199.049.05NaNNaN
2016-07-20NaNNaNNaNNaN

观察可以发现,df 中小于 9 的数都变为 NaN。

下面我们就把大于 9 的数赋值为0.

In [80]:

df[df > 9.0] = 0

In [81]:

df

Out[81]:

 openhighlowclose
2016-07-018.698.738.688.71
2016-07-048.698.868.678.81
2016-07-058.808.838.778.81
2016-07-068.808.828.768.79
2016-07-078.798.808.748.78
2016-07-088.798.798.738.74
2016-07-118.758.798.748.75
2016-07-128.758.898.748.88
2016-07-138.880.008.868.99
2016-07-148.979.008.918.94
2016-07-158.959.008.918.99
2016-07-188.990.008.970.00
2016-07-190.000.008.958.97
2016-07-208.968.998.958.96

发现大于 9 的数都被替换为了0.

接下来教大家使用isin()方法来过滤在指定列中的数据:

In [83]:

# 选取 high 列中数为 0 和 9 的数。
df[df['high'].isin([0.00,9.00])]

Out[83]:

 openhighlowclose
2016-07-138.8808.868.99
2016-07-148.9798.918.94
2016-07-158.9598.918.99
2016-07-188.9908.970.00
2016-07-190.0008.958.97

3. Panel

平台get_price,如果是多支股票, 则返回pandas.Panel对象。更多内容请参考http://pandas.pydata.org/pandas-docs/stable/api.html#panel

可通过 panel[列标,行标,股票代码] 获取数据.

In [1]:

panel = get_price(['000001.XSHE','000002.XSHE'],start_date='2016-07-12', end_date='2016-07-15', frequency='daily', fields=['open','high','low','close'])
panel

Out[1]:

<class 'pandas.core.panel.Panel'>
Dimensions: 4 (items) x 4 (major_axis) x 2 (minor_axis)
Items axis: close to open
Major_axis axis: 2016-07-12 00:00:00 to 2016-07-15 00:00:00
Minor_axis axis: 000001.XSHE to 000002.XSHE

由打印的结果可以看出:

  • 列标(Items axis: close to open)
  • 行标(Major_axis axis: 2016-07-12 00:00:00 to 2016-07-15 00:00:00)
  • 股票代码(Minor_axis axis: 000001.XSHE to 000002.XSHE)

In [2]:

# 取出 'open'数据
panel['open',:,:]

Out[2]:

 000001.XSHE000002.XSHE
2016-07-128.7517.53
2016-07-138.8817.27
2016-07-148.9717.41
2016-07-158.9517.18

In [3]:

# 取出 '2016-07-15'数据
panel[:,'2016-07-15',:]

Out[3]:

 closehighlowopen
000001.XSHE8.999.008.918.95
000002.XSHE17.1717.3217.1417.18

In [4]:

# 取出 000001 的 DataFrame 数据
panel[:,:,'000001.XSHE']

Out[4]:

 closehighlowopen
2016-07-128.888.898.748.75
2016-07-138.999.058.868.88
2016-07-148.949.008.918.97
2016-07-158.999.008.918.95

Panel 操作与 DataFrame 基本相同,下节会为大家讲解 DataFrame 的数据处理与规整。

来自:https://www.joinquant.com/post/e0cdefd3356965b702231ad2babc227b?f=stydy&m=python

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值