一、索引
1、索引的基本设置
1.1、设置行索引
准备数据:
import pandas as pd
stock_data = pd.read_csv('File/csv_files/stock_day.csv')
# pd.head()默认查看前五行数据
stock_data.head()
设置索引
'''
DataFrame.set_index(keys, drop=True, append=False, inplace=False, verify_integrity=False)
参数解释:
keys:列标签(列索引)
drop:默认为True,在values中删除被设置为索引的列
append:默认为False,保留原来的索引,追加索引
inplace:默认为False,就地修改DataFrame,不再创建新对象
verify_integrity:默认为false,检查新索引的副本。否则,请将检查推迟到必要时进行。将其设置为false将提高该方法的性能
'''
# 设置trandate列数据为行索引
stock_data.set_index(keys = 'trandate',inplace=True)
stock_data.head()
查看行索引:
stock_data.index
Index(['2018-02-27', '2018-02-26', '2018-02-23', '2018-02-22', '2018-02-14',
'2018-02-13', '2018-02-12', '2018-02-09', '2018-02-08', '2018-02-07',
...
'2015-03-13', '2015-03-12', '2015-03-11', '2015-03-10', '2015-03-09',
'2015-03-06', '2015-03-05', '2015-03-04', '2015-03-03', '2015-03-02'],
dtype='object', name='trandate', length=643)
查看行索引的名字
stock_data.index.name
# 'trandate'
'''
DataFrame.reset_index(level=None, drop=False, inplace=False, col_level=0, col_fill='')
参数解释
level:可填入int, str, tuple, list类型, 默认 None,
仅从索引中删除给定级别。默认情况下删除所有级别。
drop:默认False,索引列会被还原为普通列,行索引被重置为默认的int索引
设置为True,索引列丢失。
inplace:默认为False,就地修改DataFrame,不再创建新对象
col_level:int或str,默认值为0,如果列有多个级别,则确定将标签插入到哪个级别。默认情况下,它将插入到第一级。
col_fill:对象,默认'',如果列有多个级别,则确定其他级别的命名方式。如果没有,则重复索引名
使用场景:
数据清洗时,若将带空值的行删除,此时DataFrame或Series类型的数据不再是连续的索引,可以使用reset_index()重置索引
'''
stock_data.head()
重置索引
stock_data.reset_index(drop=True,inplace=True)
stock_data.head()
行索引变成了默认的int型索引,且因为设置了inplace=True,数据中没有了trandate
1.2、设置列索引
数据准备:
stock_data = pd.read_csv('File/csv_files/stock_day.csv',usecols = ['trandate','open','close'])
stock_data.head()
列索引:
stock_data.columns
# Index(['trandate', 'open', 'close'], dtype='object')
虽然列索引返回的是个列表,但是不可以通过下标去修改其中的元素,会出现如下的报错:
stock_data.columns[0]='date'
TypeError: Index does not support mutable operations
正确修改姿势:
对整个列索引进行修改并重新赋值
column_label = ['交易日期','开市价格','闭市价格']
# 替换整个列索引
stock_data.columns = column_label
stock_data
2、数据的索引查询
1.1、使用索引名直接索引
直接使用行索引或列索引,要注意先列后行!
数据如下:
- 使用列索引
stock_data["open"].head()
返回行索引及想要查询的列数据
- 使用行索引
直接使用行索引,报错KeyError。
stock_data["2018-02-07"]
先索引列,再索引行
# 直接使用行列索引名时,需要先列再行
stock_data['open']["2018-02-07"]
1.2、按索引名字索引: DataFrame.loc[ ]
- 可直接单独使用行索引名进行索引,不能单独使用列索引名进行索引
stock_data.loc["2018-02-07"]
- 同时对行和列进行索引时,先行后列
stock_data.loc["2018-02-07"]['close']
21.29
- 可结合数字索引一起使用
stock_data.loc["2018-02-07"][5]
-0.5
1.3、按数字索引: DataFrame.iloc[ ]
- 可单独索引行
# 取第二行的数据
stock_data.iloc[1]
- 可单独索引列
# 取第五列的数据
stock_data.iloc[:,4].head()
- 行在前列在后
# 取第2行、第4列的数据
stock_data.iloc[1][3]
22.8
取多行多列数据
# 取3-4行、1-2列数据
stock_data.iloc[2:4,0:2].head()
根据坐标取数据
# 根据坐标取数据(2,0)、(4,2)
stock_data.iloc[[2,4],[0,2]]
3、索引的排序
DataFrame.sort_index()
'''
DataFrame.sort_index(axis=0, level=None, ascending=True, inplace=False, kind='quicksort', na_position='last', sort_remaining=True, by=None)
常用参数说明:
axis:默认为0,按列进行排序
ascending:默认为True,升序排序;False,降序排序
inplace:默认False,创建一个排序后的新对象;为True时,对DataFrame数组进行原地操作,不创建新对象
'''
stock_data.sort_index().head()
升序:
stock_data.sort_index(ascending = False).head()
降序:
二、DataFrame的增删改查
主要以DataFrame为例,方法差不多
1、增
'''
对新列进行复制
DataFrame[new_column] =
'''
stock_data['diff_price'] = stock_data['close'] - stock_data['open']
stock_data.head()
新增了diff_price列
2、删
删除行
'''
DataFrame.drop(labels=None, axis=0, index=None, columns=None, level=None, inplace=False, errors='raise')
常用参数说明:
labels:要删除的行或列索引标签
axis:默认0,删除行;1,删除列
index:效果等同于labels
columns:效果等同于labels
inplace:是否直接对原数组进行操作
注意:
使用labels要注意指定axis
使用index,columns则无需搭配axis
'''
stock_data.drop(labels =['2018-02-26','2018-02-23']).head()
箭头为原本’2018-02-26’,'2018-02-23’行所存在的位置,数据被删除
删除列
# 等同于stock_data.drop(columns =['open','close'],axis = 1).head()
stock_data.drop(labels =['open','close'],axis = 1).head()
‘open’,'close’两列被删除
3、改
初始数据:
- 修改列顺序
'''
DataFrame.insert(loc, column, value, allow_duplicates=False)
常用参数说明:
loc:要插入的位置
column:列标签
value:列标签对应的列数据
'''
# 1、取出要改变位置的列数据(Seires)
high = stock_data['high']
high.head()
# 删除要改变位置的列数据
stock_data.drop(columns='high',inplace = True)
stock_data.head()
open后面的high列已被删除
# 插入删除的数据到指定位置
stock_data.insert(2,'high',high)
stock_data.head()
- 修改行列索引
'''
DataFrame.rename(mapper=None, index=None, columns=None, axis=None, copy=True, inplace=False, level=None)
常用参数说明:
index:行索引 ,index = {旧索引名:新索引名}
columns:列索引 ,columns = {旧索引名:新索引名}
'''
stock_data.rename(index = {'2018-02-27':'2018年2月27号'},columns ={'open':'开市','close':'闭市'}).head()
4、查
'''
DataFrame.query(expr, inplace=False, **kwargs)
常用参数说明:
expr:表达式
inplace:是否将原数组修改为返回的查询结果
'''
stock_data.query("open >20 & open<22",inplace=True)
返回布尔值
'''
DataFrame[column].between(a, b, inclusive =True)
常用参数说明:
inclusive = True ,区间为[a, b] 闭区间
inclusive = False ,区间为(a, b) 开区间
'''
stock_data['p_change'].between(-1,1,inclusive =True).head()
'''
DataFrame.isin(values)
values:只能放入列表或者字典类型的数据
函数作用:
查看数组是否有元素与values中的元素相同
'''
cust_data.isin(['行业码支付',]).head()
'''
DataFrame[columns].str.contain(values)
函数作用:
查看数组是否有元素包含values中的字符
'''
cust_data['渠道返回说明'].str.contains('交易').head()