取用数据的时候有时候会取用dataframe的格式,本篇重点整理了相关的选取数据的内容,以便大家查阅和学习。欢迎反馈:)
本篇是dataframe专题使用指南的一篇,更多请查看:pandas dataframe 专题使用指南
# 导入pandas模块
import pandas as pd
# 获得一个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. ]])
# 选择行标签为'2016-02-01',列标签为'open',的数据
df.loc['2016-02-01','open']
8.0800000000000001
注意位置从0开始计算,即第一行是的位置对应的是0
# 选择第1行第1列的数据
df.iloc[0,0]
8.0800000000000001
# 选择第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
如上此时返回的是一个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['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 |
本社区仅针对特定人员开放
查看需注册登录并通过风险意识测评
5秒后跳转登录页面...
移动端课程