Pandas简介及基础操作

本文详细介绍了Pandas库的基础知识,包括DataFrame、Panel和Series等核心数据结构及其操作。讲解了如何进行数据读取、存储、排序、运算以及绘图,并举例展示了如何使用Pandas进行数据处理和分析。此外,还涵盖了文件的读取与存储,如CSV、HDF5和JSON格式。
摘要由CSDN通过智能技术生成

Pandas

基础处理
    Pandas是什么?为什么用?
    核心数据结构
        DataFrame
        Panel
        Series
    基本操作
    运算
    画图
    文件的读取与存储
高级处理

4.1Pandas介绍

4.1.1 Pandas介绍 - 数据处理工具

    panel + data + analysis
    panel面板数据 - 计量经济学 三维数据

4.1.2 为什么使用Pandas

    便捷的数据处理能力
    读取文件方便
    封装了Matplotlib、Numpy的画图和计算

4.1.3 Pandas核心数据结构

1. DataFrame
DataFrame是一个类似于二维数组或表格(如excel)的对象,既有行索引,又有列索引

在这里插入图片描述

1 DataFrame的创建
# 导入pandas
import pandas as pd
# pd.DataFrame(data=None, index=None, columns=None)
pd.DataFrame(np.random.randn(2,3))

在这里插入图片描述

eg:创建学生成绩表
# 生成10名同学,5门功课的数据
score = np.random.randint(40, 100, (10, 5))

结果
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中的数据结构
score_df = pd.DataFrame(score)

在这里插入图片描述

# 给分数数据增加行列索引,显示效果更佳
# 构造行索引序列
subjects = ["语文", "数学", "英语", "政治", "体育"]
# 构造列索引序列
stu = ['同学' + str(i) for i in range(score_df.shape[0])]
# 添加行索引
data = pd.DataFrame(score, columns=subjects, index=stu)

在这里插入图片描述

2 属性:
data.shape
结果
(10, 5)
data.index
结果
Index(['同学0', '同学1', '同学2', '同学3', '同学4', '同学5', '同学6', '同学7', '同学8', '同学9'], dtype='object')
data.columns
结果
Index(['语文', '数学', '英语', '政治', '体育'], dtype='object')
data.values
结果
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]])
data.T

在这里插入图片描述

3 方法:
data.head() # 显示前5行
data.tail() # 显示后5行
4 DataFrame索引的设置
  1)修改行列索引值
# 必须整体全部修改
stu = ["学生_" + str(i) for i in range(score_df.shape[0])]
data.index = stu
  2)重设索引	
reset_index(drop=False)

在这里插入图片描述

  3)设置新索引
set_index(keys, drop=True)
2. .MultiIndex与Panel
    MultiIndex是三维的数据结构;多级索引(也称层次化索引)是pandas的重要功能,可以在Series、DataFrame对象上拥有2个以及2个以上的索引。
DataFrame的容器
df.index
结果
MultiIndex(levels=[[2012, 2013, 2014], [1, 4, 7, 10]],
labels=[[0, 2, 1, 2], [0, 1, 2, 3]],
names=['year', 'month'])
  • index属性
    • names:levels的名称
    • levels:每个level的元组值
df.index.names
# FrozenList(['year', 'month'])
df.index.levels
# FrozenList([[1, 2], [1, 4, 7, 10]])
1 multiIndex的创建
arrays = [[1, 1, 2, 2], ['red', 'blue', 'red', 'blue']]
pd.MultiIndex.from_arrays(arrays, names=('number', 'color'))
结果
MultiIndex(levels=[[1, 2], ['blue', 'red']],
			codes=[[0, 0, 1, 1], [1, 0, 1, 0]],
			names=['number', 'color'])
1 Panel的创建
p = pd.Panel(data=np.arange(24).reshape(4,3,2),
items=list('ABCD'),
major_axis=pd.date_range('20130101', periods=3),
minor_axis=['first', 'second'])
结果
<class 'pandas.core.panel.Panel'>
Dimensions: 4 (items) x 3 (major_axis) x 2 (minor_axis)
Items axis: A to D
Major_axis axis: 2013-01-01 00:00:00 to 2013-01-03 00:00:00
Minor_axis axis: first to second
2 查看panel数据
p[:,:,"first"]
p["B",:,:]

注:Pandas从版本0.20.0开始弃用:推荐的用于表示3D数据的方法是通过DataFrame上的MultiIndex方法

3. Series
 Series是一个类似于一维数组的数据结构,它能够保存任何类型的数据,比如整数、字符串、浮点数等,主要由一组数据和与之相关的索引两部分构成。

在这里插入图片描述

  带索引的一维数组
  属性  index,values

index

color_count.index
# 结果
Index(['blue', 'green', 'red', 'yellow'], dtype='object')

values

 color_count.values
# 结果
array([ 200, 500, 100, 1000])

总结:
DataFrame是Series的容器
Panel是DataFrame的容器

4.2 基本数据操作

4.2.1 索引操作

# 读取文件
data = pd.read_csv("./data/stock_day.csv")
# 删除一些列,让数据更简单些,再去做后面的操作
data = data.drop(["ma5","ma10","ma20","v_ma5","v_ma10","v_ma20"], axis=1)

在这里插入图片描述

1)直接索引(先列后行)
# 直接使用行列索引名字的方式(先列后行)
data['open']['2018-02-27']
23.53
# 不支持的操作
# 错误
data['2018-02-27']['open']
# 错误
data[:1, :2]
2)按名字索引 loc
# 使用loc:只能指定行列索引的名字
data.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
3)按数字索引 iloc
# 使用iloc可以通过索引的下标去获取
# 获取前3天数据,前5列的结果
data.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      
4)组合索引 (数字、名字)

获取行第1天到第4天,[‘open’, ‘close’, ‘high’, ‘low’]这个四个指标的结果

# 使用ix进行下表和名称组合做引
data.ix[0:4, ['open', 'close', 'high', 'low']]
# 推荐使用loc和iloc来获取的方式
data.loc[data.index[0:4], ['open', 'close', 'high', 'low']]
data.iloc[0:4, data.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

4.2.3 排序

dataframe排序
# 按照开盘价大小进行排序 , 使用ascending指定按照大小排序
data.sort_values(by="open", ascending=True).head()

在这里插入图片描述

# 按照多个键进行排序
data.sort_values(by=['open', 'high'])

在这里插入图片描述

# 对索引进行排序
data.sort_index()

在这里插入图片描述

series排序
data['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
# 对索引进行排序
data['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

4.3 DataFrame运算

算术运算
data['open'].add(1)

2018-02-27 24.53
2018-02-26 23.80
2018-02-23 23.88
2018-02-22 23.25
2018-02-14 22.49
逻辑运算

逻辑运算符——布尔索引

data["open"] > 23

2018-02-27 True
2018-02-26 False
2018-02-23 False
2018-02-22 False
2018-02-14 False
# 逻辑判断的结果可以作为筛选的依据
data[data["open"] > 23].head()

在这里插入图片描述

data[(data["open"] > 23) & (data["open"] < 24)].head()

在这里插入图片描述
逻辑运算函数

data.query("open<24 & open>23").head()    
# 可以指定值进行一个判断,从而进行筛选操作
data[data["open"].isin([23.53, 23.85])]

在这里插入图片描述

统计运算——min max mean median var std
# 计算平均值、标准差、最大值、最小值
data.describe()

在这里插入图片描述

在这里插入图片描述![

# 使用统计函数:0 代表列求结果, 1 代表行求统计结果
data.max(0)

open 34.99
high 36.35
close 35.21
low 34.01
volume 501915.41
price_change 3.03
p_change 10.03
turnover 12.56
my_price_change 3.41
dtype: float64
# 方差
data.var(0)
open 1.545255e+01
high 1.662665e+01
close 1.554572e+01
low 1.437902e+01
volume 5.458124e+09
price_change 8.072595e-01
p_change 1.664394e+01
turnover 4.323800e+00
my_price_change 6.409037e-01
dtype: float64
# 标准差
data.std(0)
open 3.930973
high 4.077578
close 3.942806
low 3.791968
volume 73879.119354
price_change 0.898476
p_change 4.079698
turnover 2.079375
my_price_change 0.800565
dtype: float64
df = pd.DataFrame({'COL1' : [2,3,4,5,4,2],

'COL2' : [0,1,2,3,4,2]})
df.median()
COL1 3.5
COL2 2.0
dtype: float64
# 求出最大值的位置
data.idxmax(axis=0)

open 2015-06-15
high 2015-06-10
close 2015-06-12
low 2015-06-12
volume 2017-10-26
price_change 2015-06-09
p_change 2015-08-28
turnover 2017-10-26
my_price_change 2015-07-10
dtype: object


# 求出最小值的位置
data.idxmin(axis=0)

open 2015-03-02
high 2015-03-02
close 2015-09-02
low 2015-03-02
volume 2016-07-06
price_change 2015-06-15
p_change 2015-09-01
turnover 2016-07-06
my_price_change 2015-06-15
dtype: object
累计统计函数

在这里插入图片描述
在这里插入图片描述

# 排序之后,进行累计求和
data = data.sort_index()
stock_rise = data['p_change']
# plot方法集成了前面直方图、条形图、饼图、折线图
stock_rise.cumsum()

2015-03-02 2.62
2015-03-03 4.06
2015-03-04 5.63
2015-03-05 7.65
2015-03-06 16.16
2015-03-09 16.37
2015-03-10 18.75
2015-03-11 16.36
2015-03-12 15.03
2015-03-13 17.58
2015-03-16 20.34
2015-03-17 22.42
2015-03-18 23.28
2015-03-19 23.74
2015-03-20 23.48
2015-03-23 23.74
import matplotlib.pyplot as plt
# plot显示图形
stock_rise.cumsum().plot()
# 需要调用show,才能显示出结果
plt.show()

在这里插入图片描述

自定义运算、

apply(func, axis=0)True
func:自定义函数

data[['open', 'close']].apply(lambda x: x.max() - x.min(), axis=0)

open 22.74
close 22.85
dtype: float64

4.4 Pandas画图

1 pandas.DataFrame.plot
  • DataFrame.plot (kind=‘line’)
  • kind : str,需要绘制图形的种类
    • ‘line’ : line plot (default)
    • ‘bar’ : vertical bar plot
    • ‘barh’ : horizontal bar plot
      • 关于“barh”的解释:
      • http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.plot.barh.html
    • ‘hist’ : histogram
    • ‘pie’ : pie plot
    • ‘scatter’ : scatter plot

更多细节:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.plot.html

2 pandas.Series.plot

更多细节:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.plot.html

4.5 文件读取与存储

在这里插入图片描述

4.5.1 CSV

pd.read_csv(path)
    usecols=
    names=
dataframe.to_csv(path)
    columns=[]
    index=False
    header=False

4.5.2 HDF5

hdf5 存储 3维数据的文件
    key1 dataframe1二维数据
    key2 dataframe2二维数据
pd.read_hdf(path, key=)
df.to_hdf(path, key=)

4.5.3 JSON

pd.read_json(path)
    orient="records"
    lines=True
df.to_json(patn)
    orient="records"
    lines=True
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值