请 [注册] 或 [登录]  | 返回主站

量化交易吧 /  数理科学 帖子:3364712 新帖:0

【dataframe】选取数据

我太难了发表于:5 月 10 日 05:16回复(1)

取用数据的时候有时候会取用dataframe的格式,本篇重点整理了相关的选取数据的内容,以便大家查阅和学习。欢迎反馈:)

摘要

  • 选取行名、列名、值
  • 以标签(行、列的名字)为索引选择数据—— x.loc[行标签,列标签]
  • 以位置(第几行、第几列)为索引选择数据—— x.iloc[行位置,列位置]
  • 同时根据标签和位置选择数据——x.ix[行,列]
  • 选择连续的多行多列——切片
  • 选择不连续的某几行或某几列
  • 简便地获取行或列
  • 如何返回一个dataframe的单列或单行
  • 按条件选取数据——df[逻辑条件]

本篇是dataframe专题使用指南的一篇,更多请查看:pandas dataframe 专题使用指南

dataframe 选取数据¶

摘要¶

  • 选取行名、列名、值
  • 以标签(行、列的名字)为索引选择数据—— x.loc[行标签,列标签]
  • 以位置(第几行、第几列)为索引选择数据—— x.iloc[行位置,列位置]
  • 同时根据标签和位置选择数据——x.ix[行,列]
  • 选择连续的多行多列——切片
  • 选择不连续的某几行或某几列
  • 简便地获取行或列
  • 如何返回一个dataframe的单列或单行
  • 按条件选取数据——df[逻辑条件]
# 导入pandas模块
import pandas as pd

获得一个dataframe类型的数据样例¶

# 获得一个dataframe类型的数据样例
df=get_price('000001.XSHE',start_date='2016-02-01',end_date='2016-02-04',frequency='daily',fields=['open','close','high','low'])
df
open close high low
2016-02-01 8.08 7.93 8.10 7.88
2016-02-02 7.93 8.05 8.12 7.92
2016-02-03 7.97 7.97 8.00 7.91
2016-02-04 8.00 8.05 8.09 8.00

选择行名¶

df.index
DatetimeIndex(['2016-02-01', '2016-02-02', '2016-02-03', '2016-02-04'], dtype='datetime64[ns]', freq=None, tz=None)

选择列名¶

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

选择值¶

df.values
array([[ 8.08,  7.93,  8.1 ,  7.88],
       [ 7.93,  8.05,  8.12,  7.92],
       [ 7.97,  7.97,  8.  ,  7.91],
       [ 8.  ,  8.05,  8.09,  8.  ]])

以标签(行、列的名字)为索引选择数据—— df.loc[行标签,列标签]¶

# 选择行标签为'2016-02-01',列标签为'open',的数据
df.loc['2016-02-01','open']
8.0800000000000001

以位置(第几行、第几列)为索引选择数据—— df.iloc[行位置,列位置]¶

注意位置从0开始计算,即第一行是的位置对应的是0

# 选择第1行第1列的数据
df.iloc[0,0]
8.0800000000000001

同时根据标签和位置选择数据——df.ix[行,列]¶

# 选择第1行列为‘open’的数据
df.ix[0,'open']
8.0800000000000001

选择连续的多行多列——切片¶

起点索引:终点索引 这种用法叫做一个切片,指从起点索引到终点索引。看实际用法就懂了。

如果起点索引省略代表从头开始,终点索引省略代表直到最后,都省略就代表全部了。

切片在.loc.iloc.ix三种方法中都可以应用

#选择行从'2016-02-02'到'2016-02-04',列从'open'到'high'的数据
df.loc['2016-02-02':'2016-02-04','open':'high']
open close high
2016-02-02 7.93 8.05 8.12
2016-02-03 7.97 7.97 8.00
2016-02-04 8.00 8.05 8.09
#选择从第2行到最后一行,列从第1列到第3列的数据
df.iloc[1:,0:3]
open close high
2016-02-02 7.93 8.05 8.12
2016-02-03 7.97 7.97 8.00
2016-02-04 8.00 8.05 8.09

由上例可见,当以位置为索引时,切片是不包括终点的,是左闭右开的。即第1列到第3列不是写作0:2而是0:3。

# 选择选择行从'2016-02-02'到'2016-02-04',列从第1列到第3列的数据
df.ix['2016-02-02':'2016-02-04',:3]
open close high
2016-02-02 7.93 8.05 8.12
2016-02-03 7.97 7.97 8.00
2016-02-04 8.00 8.05 8.09

选择不连续的某几行或某几列¶

df.loc[:,['open','high']]
open high
2016-02-01 8.08 8.10
2016-02-02 7.93 8.12
2016-02-03 7.97 8.00
2016-02-04 8.00 8.09
df.iloc[:,[0,2]]
open high
2016-02-01 8.08 8.10
2016-02-02 7.93 8.12
2016-02-03 7.97 8.00
2016-02-04 8.00 8.09
df.ix[[0,2],['open','high']]
open high
2016-02-01 8.08 8.1
2016-02-03 7.97 8.0

备注:当以标签名选取不连续的某几行的时候在这个例子中如df.loc['2016-02-02','2016-02-04',:]这样写会出错,,是时间格式的原因,这样写就可以了df.ix[[pd.Timestamp('2016-02-02'), pd.Timestamp('2016-02-04')]]

简便地获取行或列¶

直接用切片获取行,直接用标签名获取列。注意不要错乱。

df['2016-02-02':'2016-02-04']
open close high low
2016-02-02 7.93 8.05 8.12 7.92
2016-02-03 7.97 7.97 8.00 7.91
2016-02-04 8.00 8.05 8.09 8.00
df[0:3]
open close high low
2016-02-01 8.08 7.93 8.10 7.88
2016-02-02 7.93 8.05 8.12 7.92
2016-02-03 7.97 7.97 8.00 7.91
df[['open','high']]
open high
2016-02-01 8.08 8.10
2016-02-02 7.93 8.12
2016-02-03 7.97 8.00
2016-02-04 8.00 8.09
df['open']
2016-02-01    8.08
2016-02-02    7.93
2016-02-03    7.97
2016-02-04    8.00
Name: open, dtype: float64

如何返回一个dataframe的单列或单行¶

如上此时返回的是一个series,而不是dataframe,有时单独只获取一行的时候也会返回一个series,如df.ix[0,:]

df.ix[0,:]
open     8.08
close    7.93
high     8.10
low      7.88
Name: 2016-02-01 00:00:00, dtype: float64

若要返回dataframe,可用中括号把索引括上,如下。

df[['open']]
open
2016-02-01 8.08
2016-02-02 7.93
2016-02-03 7.97
2016-02-04 8.00
df.ix[[0],:]
open close high low
2016-02-01 8.08 7.93 8.1 7.88

按条件选取数据——df[逻辑条件]¶

逻辑条件支持&(与)、|(或)、~(非)等逻辑运算

df[df['open']>=8]
open close high low
2016-02-01 8.08 7.93 8.10 7.88
2016-02-04 8.00 8.05 8.09 8.00
## 多个条件之间运算时用括号括起来
df[(df.index=='2016-02-02') | (df['open']>=8)]
open close high low
2016-02-01 8.08 7.93 8.10 7.88
2016-02-02 7.93 8.05 8.12 7.92
2016-02-04 8.00 8.05 8.09 8.00
## 选择df中不在[8.10,8]的数据
df[~df.isin([8.10,8])]
open close high low
2016-02-01 8.08 7.93 NaN 7.88
2016-02-02 7.93 8.05 8.12 7.92
2016-02-03 7.97 7.97 NaN 7.91
2016-02-04 NaN 8.05 8.09 NaN

这个方法有个常用情景,即按条件修改数据:

# 把df中open大于8的替换为123
df[df['open']>=8]=123
df
open close high low
2016-02-01 123.00 123.00 123.00 123.00
2016-02-02 7.93 8.05 8.12 7.92
2016-02-03 7.97 7.97 8.00 7.91
2016-02-04 123.00 123.00 123.00 123.00

全部回复

0/140

达人推荐

量化课程

    移动端课程