Pandas介绍
为什么要学习pandas?
那么问题来了:
numpy 已经能够帮助我们处理数据,能够结合 matplotlib 解决我们数据分析的问题,那么 pandas 学习的目的在什么地方呢?
numpy 能够帮我们处理处理数值型数据,但是这还不够, 很多时候,我们的数据除了数值之外,还有字符串,还有时间序列等
比如:我们通过爬虫获取到了存储在数据库中的数据
所以,pandas 出现了。
什么是Pandas?
Pandas的名称来自于面板数据(panel data)
Pandas是一个强大的分析结构化数据的工具集,基于NumPy构建,提供了高级数据结构和数据操作工具,它是使Python成为强大而高效的数据分析环境的重要因素之一。
- 一个强大的分析和操作大型结构化数据集所需的工具集
- 基础是NumPy,提供了高性能矩阵的运算
- 提供了大量能够快速便捷地处理数据的函数和方法
- 应用于数据挖掘,数据分析
- 提供数据清洗功能
增强图表可读性
回忆我们在numpy当中创建学生成绩表样式:
返回结果:
array([[92, 55, 78, 50, 50], [71, 76, 50, 48, 96], [45, 84, 78, 51, 68], [81, 91, 56, 54, 76], [86, 66, 77, 67, 95], [46, 86, 56, 61, 99], [46, 95, 44, 46, 56], [80, 50, 45, 65, 57], [41, 93, 90, 41, 97], [65, 83, 57, 57, 40]])
如果数据展示为这样,可读性就会更友好:
- 读取文件方便
数据读取与存储
我们的数据大部分存在于文件当中,所以pandas会支持复杂的IO操作,pandas的API支持众多的文件格式,如CSV、SQL、XLS、JSON、HDF5。
注:最常用的HDF5和CSV文件
官方文档:https://pandas.pydata.org/pandas-docs/stable/user_guide/io.html#csv-text-files
CSV
read_csv
- pandas.read_csv(filepath_or_buffer, sep =',', usecols )
- filepath_or_buffer:文件路径
- sep :分隔符,默认用","隔开
- usecols:指定读取的列名,列表形式
encoding
:编码
- 举例:读取之前的股票的数据
import pandas as pd
#设置显示全部行,不省略
pd.set_option('display.max_rows', None)
#设置显示全部列,不省略
pd.set_option('display.max_columns', None)
#设置显示全部列宽, 不省略
pd.set_option('display.max_colwidth', None)
"""
usecols 指定需要提取的列
"""
df = pd.read_csv('stock_day.csv',
sep=',', # 分隔符,默认为逗号
# usecols=['open', 'high', 'close', 'low'], # 指定获取的列
encoding='utf-8',
index_col=False, # 是否读取索引
names=['开盘价', '最高价', '收盘价', '最低价'], # 直接指定列明
engine='python' # c 速度更快, python功能更完整
)
print(df)
df.to_csv('stock_day_back.csv')
to_csv
- DataFrame.to_csv(path_or_buf=None, sep=', ’, columns=None, header=True, index=True, mode='w', encoding=None)
- path_or_buf :文件路径
- sep :分隔符,默认用","隔开
- columns :选择需要的列索引
- header :boolean or list of string, default True,是否写进列索引值
- index:是否写进行索引
- mode:'w':重写, 'a' 追加
- 举例:保存读取出来的股票数据
- 保存'open'列的数据,然后读取查看结果
# 选取10行数据保存,便于观察数据
df[:10].to_csv('stock_day_back.csv',
index=False, # 是否保留索引
columns=['open'] # 保存列
)
会发现将索引存入到文件当中,变成单独的一列数据。如果需要删除,可以指定index参数,删除原来的文件,重新保存一次。
# 读取,查看结果
pd.read_csv("stock_day_back.csv")
open
23.53
22.8
22.88
22.25
21.49
21.4
20.7
21.2
21.79
22.69
JSON
JSON是我们常用的一种数据交换格式,前面在前后端的交互经常用到,也会在存储的时候选择这种格式。所以我们需要知道Pandas如何进行读取和存储JSON格式。
read_json
pandas.read_json(path_or_buf=None, orient=None, typ='frame', lines=False)
将JSON格式准换成默认的Pandas DataFrame格式
orient : string,Indication of expected JSON string format.
'split' : dict like {index -> [index], columns -> [columns], data -> [values]}
- split 将索引总结到索引,列名到列名,数据到数据。将三部分都分开了
'records' : list like [{column -> value}, ... , {column -> value}]
- records 以
columns:values
的形式输出
- records 以
'index' : dict like {index -> {column -> value}}
- index 以
index:{columns:values}...
的形式输出
- index 以
'columns' : dict like {column -> {index -> value}}
,默认该格式
- colums 以
columns:{index:values}
的形式输出
- colums 以
lines : boolean, default False
- 按照每行读取json对象
typ : default ‘frame’, 指定转换成的对象类型series或者dataframe
read_josn 案例
- 数据介绍
这里使用一个新闻标题讽刺数据集,格式为json。is_sarcastic
:1讽刺的,否则为0;headline
:新闻报道的标题;article_link
:链接到原始新闻文章。存储格式为:
[
{
"name": "邵帆",
"job": "机修工",
"address": "广西壮族自治区建国市花溪合肥街t座 303979"
},
{
"name": "何丹丹",
"job": "系统测试",
"address": "湖北省沈阳市清城杨路b座 435741"
},
{
"name": "范佳",
"job": "汽车修理工",
"address": "四川省建县丰都李街e座 707065"
},
{
"name": "王云",
"job": "服装/纺织/皮革工艺师",
"address": "内蒙古自治区长沙市双滦巢湖路D座 438460"
},
{
"name": "赵玉珍",
"job": "ERP技术开发",
"address": "吉林省玉华市崇文杨路l座 846818"
},
{
"name": "倪阳",
"job": "销售行政专员",
"address": "甘肃省欢县怀柔重庆路H座 950331"
},
{
"name": "成莉",
"job": "麻醉医生",
"address": "广西壮族自治区文市华龙余路q座 603504"
},
{
"name": "任斌",
"job": "其他",
"address": "湖北省上海县东城长沙街D座 331924"
},
{
"name": "赵霞",
"job": "医疗器械注册",
"address": "北京市燕市双滦澳门路I座 647751"
},
{
"name": "黄莹",
"job": "其他",
"address": "福建省惠州县涪城王街j座 216044"
}
]
- 读取
orient指定存储的json格式,lines指定按照行去变成一个样本
import pandas as pd
df = pd.read_json('info-records.json',
orient='records' # json 数据为字典
)
print(df)
结果为:
name job address
0 邵帆 机修工 广西壮族自治区建国市花溪合肥街t座 303979
1 何丹丹 系统测试 湖北省沈阳市清城杨路b座 435741
2 范佳 汽车修理工 四川省建县丰都李街e座 707065
3 王云 服装/纺织/皮革工艺师 内蒙古自治区长沙市双滦巢湖路D座 438460
4 赵玉珍 ERP技术开发 吉林省玉华市崇文杨路l座 846818
5 倪阳 销售行政专员 甘肃省欢县怀柔重庆路H座 950331
6 成莉 麻醉医生 广西壮族自治区文市华龙余路q座 603504
7 任斌 其他 湖北省上海县东城长沙街D座 331924
8 赵霞 医疗器械注册 北京市燕市双滦澳门路I座 647751
9 黄莹 其他 福建省惠州县涪城王街j座 216044
to_json
DataFrame.to_json(path_or_buf=None, orient=None,lines=False)
- 将Pandas 对象存储为json格式
- path_or_buf=None:文件地址
- orient:存储的json形式,{‘split’,’records’,’index’,’columns’,’values’}
- lines:一个对象存储为一行
存储文件
df.to_json('info-split.json', orient='split', # force_ascii=False, # 是否编译为 ascii 编码 date_format='utf-8' )
结果
{ "columns":["name","job","address"], "index":[0,1,2,3,4,5,6,7,8,9], "data":[["邵帆","机修工","广西壮族自治区建国市花溪合肥街t座 303979"],["何丹丹","系统测试","湖北省沈阳市清城杨路b座 435741"],["范佳","汽车修理工","四川省建县丰都李街e座 707065"],["王云","服装\/纺织\/皮革工艺师","内蒙古自治区长沙市双滦巢湖路D座 438460"],["赵玉珍","ERP技术开发","吉林省玉华市崇文杨路l座 846818"],["倪阳","销售行政专员","甘肃省欢县怀柔重庆路H座 950331"],["成莉","麻醉医生","广西壮族自治区文市华龙余路q座 603504"],["任斌","其他","湖北省上海县东城长沙街D座 331924"],["赵霞","医疗器械注册","北京市燕市双滦澳门路I座 647751"],["黄莹","其他","福建省惠州县涪城王街j座 216044"]]}
index 模式
df2.to_json('info-index.json', orient='index', force_ascii=False, # 是否编译为 ascii 编码 )
结果
{ "0":{"name":"邵帆","job":"机修工","address":"广西壮族自治区建国市花溪合肥街t座 303979"}, "1":{"name":"何丹丹","job":"系统测试","address":"湖北省沈阳市清城杨路b座 435741"}, "2":{"name":"范佳","job":"汽车修理工","address":"四川省建县丰都李街e座 707065"}, "3":{"name":"王云","job":"服装\/纺织\/皮革工艺师","address":"内蒙古自治区长沙市双滦巢湖路D座 438460"}, "4":{"name":"赵玉珍","job":"ERP技术开发","address":"吉林省玉华市崇文杨路l座 846818"}, "5":{"name":"倪阳","job":"销售行政专员","address":"甘肃省欢县怀柔重庆路H座 950331"}, "6":{"name":"成莉","job":"麻醉医生","address":"广西壮族自治区文市华龙余路q座 603504"}, "7":{"name":"任斌","job":"其他","address":"湖北省上海县东城长沙街D座 331924"}, "8":{"name":"赵霞","job":"医疗器械注册","address":"北京市燕市双滦澳门路I座 647751"}, "9":{"name":"黄莹","job":"其他","address":"福建省惠州县涪城王街j座 216044"}}
table 模式
df3.to_json('info-table.json', orient='table', force_ascii=False)
结果
{ "name":{"0":"邵帆","1":"何丹丹","2":"范佳","3":"王云","4":"赵玉珍","5":"倪阳","6":"成莉","7":"任斌","8":"赵 霞","9":"黄莹"}, "job":{"0":"机修工","1":"系统测试","2":"汽车修理工","3":"服装\/纺织\/皮革工艺师","4":"ERP技术开发","5":"销售行政专 员","6":"麻醉医生","7":"其他","8":"医疗器械注册","9":"其他"}, "address":{"0":"广西壮族自治区建国市花溪合肥街t座 303979","1":"湖北省沈阳市清城杨路b座 435741","2":"四川省建县丰都李街e 座 707065","3":"内蒙古自治区长沙市双滦巢湖路D座 438460","4":"吉林省玉华市崇文杨路l座 846818","5":"甘肃省欢县 怀柔重庆路H座 950331","6":"广西壮族自治区文市华龙余路q座 603504","7":"湖北省上海县东城长沙街D座 331924","8":"北京市燕市双滦澳门路I座 647751","9":"福建省惠州县涪城王街j座 216044"} }
HDF5
read_hdf与to_hdf
HDF5文件的读取和存储需要指定一个键,值为要存储的DataFrame
pandas.read_hdf(path_or_buf,key =None,** kwargs)
从h5文件当中读取数据
- path_or_buffer:文件路径
- key:读取的键
- return:Theselected object
DataFrame.to_hdf(path_or_buf, key, *\kwargs*)
需要安装安装tables模块避免不能读取HDF5文件
pip install tables==3.6.1
文件操作
- 读取文件
day_close = pd.read_hdf("day_close.h5")
print(day_close)
- 存储文件
day_close.to_hdf("./data/test.h5", key="day_close")
再次读取的时候, 需要指定键的名字
new_close = pd.read_hdf("./data/test.h5", key="day_close")
注意:优先选择使用HDF5文件存储
- HDF5在存储的时候支持压缩,使用的方式是blosc,这个是速度最快的也是pandas默认支持的
- 使用压缩可以提磁盘利用率,节省空间
- HDF5还是跨平台的,可以轻松迁移到hadoop 上面
Excel
Excel是微软的经典之作,在日常工作中的数据整理、分析和可视化方面,有其独到的优势,尤其在你熟练应用了函数和数据透视等高级功能之后,Excel可以大幅度提高你的工作效率
读取Excel
pd.read_excel('网易新闻.xlsx', sheet_name='表1') # sheet_name可以是整型数字或者表的名字
pd.read_excel('网易新闻.xlsx', sheet_name='表1', skiprows=[0, 1, 2]) # skiprows 跳过特定行
pd.read_excel('网易新闻.xlsx', sheet_name='表1', nrows = 10) # nrows 需要读取的行数
保存Excel
df.to_excel('文件名.xlsx')
Pandas数据结构
Pandas中一共有三种数据结构,分别为:Series、DataFrame和MultiIndex(老版本中叫Panel )。
其中Series是一维数据结构,DataFrame是二维的表格型数据结构,MultiIndex是三维的数据结构。
Series
Series是一个类似于一维数组的数据结构,它能够保存任何类型的数据,比如整数、字符串、浮点数等,主要由一组数据和与之相关的索引两部分构成。
Series的创建
# 导入pandas
import pandas as pd
pd.Series(data=None, index=None, dtype=None)
- 参数:
- data:传入的数据,可以是ndarray、list等
- index:索引,必须是唯一的,且与数据的长度相等。如果没有传入索引参数,则默认会自动创建一个从0-N的整数索引。
- dtype:数据的类型
通过已有数据创建
- 指定内容,默认索引
pd.Series(np.arange(5))
# 运行结果
0 0
1 1
2 2
3 3
4 4
dtype: int64
指定行索引名
示例代码:
ser3 = pd.Series(range(5), index=['a', 'b', 'c', 'd', 'e'])
print(ser3)
运行结果:
a 0
b 1
c 2
d 3
e 4
dtype: int64
通过字典数据创建
ser4 = pd.Series({
'red': 100, 'blue': 200, 'green': 500, 'yellow': 1000})
ser4
# 运行结果
blue 200
green 500
red 100
yellow 1000
dtype: int64
Series的属性
为了更方便地操作Series对象中的索引和数据,Series中提供了两个属性index和values
index
ser4.index # 结果 Index(['blue', 'green', 'red', 'yellow'], dtype='object')
values
ser4.values # 结果 array([ 200, 500, 100, 1000])
也可以使用索引来获取数据:
ser4[2] # 结果 100
DataFrame
DataFrame是一个类似于二维数组或表格(如excel)的对象,既有行索引,又有列索引
- 行索引,表明不同行,横向索引,叫index,0轴,axis=0
- 列索引,表名不同列,纵向索引,叫columns,1轴,axis=1
DataFrame的创建
# 导入pandas
import pandas as pd
pd.DataFrame(data=None, index=None, columns=None)
- 参数:
- index:行标签。如果没有传入索引参数,则默认会自动创建一个从0-N的整数索引。
- columns:列标签。如果没有传入索引参数,则默认会自动创建一个从0-N的整数索引。
通过已有数据创建
举例一:
pd.DataFrame(np.random.randn(2,3))
回忆咱们在前面直接使用np创建的数组显示方式,比较两者的区别。
举例二:创建学生成绩表
# "语文", "数学", "英语", "政治", "体育"
score = [
[92, 55, 78, 50, 50],
[71, 76, 50, 48, 96],
[45, 84, 78, 51, 68],
[81, 91, 56, 54, 76],
[86, 66, 77, 67, 95],
[46, 86, 56, 61, 99],
[46, 95, 44, 46, 56],
[80, 50, 45, 65, 57],
[41, 93, 90, 41, 97],
[65, 83, 57, 57, 40]
]
但是这样的数据形式很难看到存储的是什么的样的数据,可读性比较差!!
问题:如何让数据更有意义的显示?
# 生成10名同学,5门功课的数据
df1 = pd.DataFrame(score)
print('df2:\n', df1)
给分数数据增加行列索引,显示效果更佳
增加行、列索引
"""增加行列索引"""
# 构造行索引序列
subjects = ["语文", "数学", "英语", "政治", "体育"]
# 构造列索引序列
stu = ['同学' + str(i) for i in range(len(score))]
# 添加行索引
students = pd.DataFrame(score, columns=subjects, index=stu)
print('students:\n', students)
DataFrame的属性
shape
print('students.shape:\t', students.shape) # 结果 students.shape: (10, 5)
index
DataFrame的行索引列表
print('students.index:\t', students.index) # 结果 students.index: Index(['同学0', '同学1', '同学2', '同学3', '同学4', '同学5', '同学6', '同学7', '同学8', '同学9'], dtype='object')
columns
DataFrame的列索引列表
print('students.columns:\t', students.columns) # 结果 students.columns: Index(['语文', '数学', '英语', '政治', '体育'], dtype='object')
values
直接获取其中array的值
print('students.values:\n', students.values) # 结果 students.values: [[92 55 78 50 50] [71 76 50 48 96] [45 84 78 51 68] [81 91 56 54 76] [86 66 77 67 95] [46 86 56 61 99] [46 95 44 46 56] [80 50 45 65 57] [41 93 90 41 97] [65 83 57 57 40]]
T
转置
students.T
结果
head(5):显示前5行内容
如果不补充参数,默认5行。填入参数N则显示前N行
students.head(5)
tail(5):显示后5行内容
如果不补充参数,默认5行。填入参数N则显示后N行
students.tail(5)
DataFrame索引
需求:
修改行列索引值
stu = ["学生_" + str(i) for i in range(score_df.shape[0])]
# 必须整体全部修改
data.index = stu
注意:以下修改方式是错误的
# 错误修改方式
data.index[3] = '学生_3'
重设索引
- reset_index(drop=False)
- 设置新的下标索引
- drop:默认为False,不删除原来索引,如果为True,删除原来的索引值
# 重置索引,drop=False
data.reset_index()
# 重置索引,drop=True
data.reset_index(drop=True)
以某列值设置为新的索引
- set_index(keys, drop=True)
- keys : 列索引名成或者列索引名称的列表
- drop : boolean, default True.当做新的索引,删除原来的列
设置新索引案例
1、创建
df = pd.DataFrame({
'month': [1, 4, 7, 10],
'year': [2012, 2014, 2013, 2014],
'sale':[55, 40, 84, 31]})
# 输出
month sale year
0 1 55 2012
1 4 40 2014
2 7 84 2013
3 10 31 2014
2、以月份设置新的索引
df.set_index('month')
# 输出
sale year
month
1 55 2012
4 40 2014
7 84 2013
10 31 2014
3、设置多个索引,以年和月份
df = df.set_index(['year', 'month'])
df
# 输出
sale
year month
2012 1 55
2014 4 40
2013 7 84
2014 10 31
注:通过刚才的设置,这样DataFrame就变成了一个具有 MultiIndex 的 DataFrame。
索引对象
Index索引
- Series和DataFrame中的索引都是Index对象
示例代码:
df = pd.DataFrame({
'month': [1, 4, 7, 10],
'year': [2012, 2014, 2013, 2014],
'sale':[55, 40, 84, 31]})
se = pd.Series(np.arange(10))
df.index, se.index
运行结果:
(RangeIndex(start=0, stop=4, step=1), RangeIndex(start=0, stop=10, step=1))
- 索引对象不可变,保证了数据的安全
示例代码:
# 索引对象不可变
df.index[0] = 2
运行结果:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-23-7f40a356d7d1> in <module>()
1 # 索引对象不可变
----> 2 df_obj2.index[0] = 2
/Users/Power/anaconda/lib/python3.6/site-packages/pandas/indexes/base.py in __setitem__(self, key, value)
1402
1403 def __setitem__(self, key, value):
-> 1404 raise TypeError("Index does not support mutable operations")
1405
1406 def __getitem__(self, key):
TypeError: Index does not support mutable operations
Pandas层级索引
下面创建一个Series, 在输入索引Index时,输入了由两个子list组成的list,第一个子list是外层索引,第二个list是内层索引。
示例代码:
import pandas as pd
import numpy as np
ser_obj = pd.Series(np.random.randn(12),index=[
['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c', 'd', 'd', 'd'],
[0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2]
])
print(ser_obj)
运行结果:
a 0 0.099174
1 -0.310414
2 -0.558047
b 0 1.742445
1 1.152924
2 -0.725332
c 0 -0.150638
1 0.251660
2 0.063387
d 0 1.080605
1 0.567547
2 -0.154148
dtype: float64
MultiIndex索引对象
- 打印这个Series的索引类型,显示是MultiIndex
- 直接将索引打印出来,可以看到有lavels,和labels两个信息。levels表示两个层级中分别有那些标签,labels是每个位置分别是什么标签。
示例代码:
print(type(ser_obj.index))
print(ser_obj.index)
运行结果:
<class 'pandas.indexes.multi.MultiIndex'>
MultiIndex([('a', 0),
('a', 1),
('a', 2),
('b', 0),
('b', 1),
('b', 2),
('c', 0),
('c', 1),
('c', 2),
('d', 0),
('d', 1),
('d', 2)],
)
- 取值
- 根据索引获取数据。因为现在有两层索引,当通过外层索引获取数据的时候,可以直接利用外层索引的标签来获取。
- 当要通过内层索引获取数据的时候,在list中传入两个元素,前者是表示要选取的外层索引,后者表示要选取的内层索引。
- 外层选取:
ser_obj['outer_label']
示例代码:
# 外层选取
print(ser_obj['c'])
运行结果:
0 -1.362096
1 1.558091
2 -0.452313
dtype: float64
- 内层选取:
ser_obj[:, 'inner_label']
示例代码:
# 内层选取
print(ser_obj[:, 2])
运行结果:
a 0.826662
b 0.015426
c -0.452313
d -0.051063
dtype: float64
常用于分组操作、透视表的生成等
小结
- pandas的优势【了解】
- 增强图表可读性
- 便捷的数据处理能力
- 读取文件方便
- 封装了Matplotlib、Numpy的画图和计算
- series【知道】
- 创建
- pd.Series([], index=[])
- pd.Series({})
- 属性
- 对象.index
- 对象.values
- 创建
- DataFrame【掌握】
- 创建
- pd.DataFrame(data=None, index=None, columns=None)
- 属性
- shape -- 形状
- index -- 行索引
- columns -- 列索引
- values -- 查看值
- T -- 转置
- head() -- 查看头部内容
- tail() -- 查看尾部内容
- DataFrame索引
- 修改的时候,需要进行全局修改
- 对象.reset_index()
- 对象.set_index(keys)
- 创建
- MultiIndex【了解】
- multiIndex:
- 类似ndarray中的三维数组
- 创建:
- pd.MultiIndex.from_arrays()
- 属性:
- 对象.index
- multiIndex:
基本操作
为了更好的理解这些基本操作,我们将读取一个真实的股票数据。关于文件操作,后面在介绍,这里只先用一下API
import pandas as pd
# 读取文件
df = pd.read_csv("stock_day.csv")
# print(df)
# 删除一些列,让数据更简单些,再去做后面的操作
df = df.drop(["ma5", "ma10", "ma20", "v_ma5", "v_ma10", "v_ma20"], axis=1)
print(df.head())
索引操作
Numpy当中我们已经讲过使用索引选取序列和切片选择,pandas也支持类似的操作,也可以直接使用列名、行名
称,甚至组合使用。
直接使用行列索引(先列后行)
获取'2018-02-27'这天的'close'的结果
# 直接使用行列索引名字的方式(先列后行)
print(df['open']['2018-02-27'])
"""
不支持的操作
print(data['2018-02-27']['open'])
print(data[:1, :2])
"""
结合loc或者iloc使用索引
获取从'2018-02-27':'2018-02-22','open'的结果
# 使用 loc 只能指定行列索引的名字
print(df.loc['2018-02-27':'2018-02-22', 'open'])
2018-02-27 23.53
2018-02-26 22.80
2018-02-23 22.88
Name: open, dtype: float64
# 使用 iloc 可以通过索引的下标去获取
# 获取前3天数据,前5列的结果
print(df.iloc[:3, :5])
open high close low
2018-02-27 23.53 25.88 24.16 23.53
2018-02-26 22.80 23.78 23.53 22.80
2018-02-23 22.88 23.37 22.82 22.71
获取行第1天到第4天,['open', 'close', 'high', 'low']这个四个指标的结果
# 获取行第1天到第4天,['open', 'close', 'high', 'low']这个四个指标的结果
# 推荐使用loc和iloc来获取的方式
print(df.loc[df.index[0:4], ['open', 'close', 'high', 'low']])
print(df.iloc[0:4, df.columns.get_indexer(['open', 'close', 'high', 'low'])])
# 结果
open close high low
2018-02-27 23.53 24.16 25.88 23.53
2018-02-26 22.80 23.53 23.78 22.80
2018-02-23 22.88 22.82 23.37 22.71
2018-02-22 22.25 22.28 22.76 22.02
赋值操作
对DataFrame当中的close列进行重新赋值为1
# 直接修改原来的值
df['close'] = 1
# 或者
df.close = 1
print(df.close)
排序
排序有两种形式,一种对于索引进行排序,一种对于内容进行排序
DataFrame 排序
- 使用df.sort_values(by=, ascending=)
- 单个键或者多个键进行排序,
- 参数:
- by:指定排序参考的键
- ascending:默认升序
- ascending=False:降序
- ascending=True:升序
# 按照开盘价大小进行排序 , 使用ascending指定按照大小排序
print(df.sort_values(by="open", ascending=True).head())
# 按照多个键进行排序
print(df.sort_values(by=['open', 'high']).head())
- 使用 df.sort_index 给索引进行排序
这个股票的日期索引原来是从大到小,现在重新排序,从小到大
# 对索引进行排序
df.sort_index()
Series排序
- 使用series.sort_values(ascending=True)进行排序
series排序时,只有一列,不需要参数
print(df['p_change'].sort_values(ascending=True).head())
2015-09-01 -10.03
2015-09-14 -10.02
2016-01-11 -10.02
2015-07-15 -10.02
2015-08-26 -10.01
Name: p_change, dtype: float64
- 使用series.sort_index()进行排序
# 对索引进行排序
print(df['p_change'].sort_index().head())
2015-03-02 2.62
2015-03-03 1.44
2015-03-04 1.57
2015-03-05 2.02
2015-03-06 8.51
Name: p_change, dtype: float64
总结
- 1.索引【掌握】
- 直接索引 -- 先列后行,是需要通过索引的字符串进行获取
- loc -- 先行后列,是需要通过索引的字符串进行获取
- iloc -- 先行后列,是通过下标进行索引
- 2.赋值【知道】
- data[""] = **
- data. =
- 3.排序【知道】
- dataframe
- 对象.sort_values()
- 对象.sort_index()
- series
- 对象.sort_values()
- 对象.sort_index()
- dataframe