09 Python之Pandas库之数据处理与规整

Pandas库之数据处理与规整

import numpy as np
import pandas as pd
import pandas_datareader.data as web
import datetime

# 爬取数据
df = web.DataReader("AAPL","yahoo",datetime.datetime(2019,4,1),datetime.date.today())

# 展示数据
df
HighLowOpenCloseVolumeAdj Close
Date
2019-04-01191.679993188.380005191.639999191.24000527862000191.240005
2019-04-02194.460007191.050003191.089996194.02000422765700194.020004
2019-04-03196.500000193.149994193.250000195.35000623271800195.350006
2019-04-04196.369995193.139999194.789993195.69000219114300195.690002
2019-04-05197.100006195.929993196.449997197.00000018526600197.000000
2019-04-08200.229996196.339996196.419998200.10000625881700200.100006
2019-04-09202.850006199.229996200.320007199.50000035768200199.500000
2019-04-10200.740005198.179993198.679993200.61999521695300200.619995
2019-04-11201.000000198.440002200.850006198.94999720900800198.949997
2019-04-12200.139999196.210007199.199997198.86999527744300198.869995

1 缺失数据处理

1.1 去掉包含缺失值的行

df_drop = df.dropna()
df_drop.head()
HighLowOpenCloseVolumeAdj Close
Date
2019-04-01191.679993188.380005191.639999191.24000527862000191.240005
2019-04-02194.460007191.050003191.089996194.02000422765700194.020004
2019-04-03196.500000193.149994193.250000195.35000623271800195.350006
2019-04-04196.369995193.139999194.789993195.69000219114300195.690002
2019-04-05197.100006195.929993196.449997197.00000018526600197.000000

1.2 对缺失值进行补充

df_fillna = df.fillna(value=0)
df_fillna.head()
HighLowOpenCloseVolumeAdj Close
Date
2019-04-01191.679993188.380005191.639999191.24000527862000191.240005
2019-04-02194.460007191.050003191.089996194.02000422765700194.020004
2019-04-03196.500000193.149994193.250000195.35000623271800195.350006
2019-04-04196.369995193.139999194.789993195.69000219114300195.690002
2019-04-05197.100006195.929993196.449997197.00000018526600197.000000

1.3 判断数据是否为nan,并进行布尔填充

df_isnull = pd.isnull(df)
df_isnull.head()
HighLowOpenCloseVolumeAdj Close
Date
2019-04-01FalseFalseFalseFalseFalseFalse
2019-04-02FalseFalseFalseFalseFalseFalse
2019-04-03FalseFalseFalseFalseFalseFalse
2019-04-04FalseFalseFalseFalseFalseFalse
2019-04-05FalseFalseFalseFalseFalseFalse

2 函数的应用和映射

# 列计算平均值
df.mean()
High         1.981070e+02
Low          1.950050e+02
Open         1.962690e+02
Close        1.971340e+02
Volume       2.435307e+07
Adj Close    1.971340e+02
dtype: float64
# 行计算平均值
df.mean(1)
Date
2019-04-01    4.643826e+06
2019-04-02    3.794444e+06
2019-04-03    3.878796e+06
2019-04-04    3.185879e+06
2019-04-05    3.087931e+06
2019-04-08    4.313782e+06
2019-04-09    5.961534e+06
2019-04-10    3.616050e+06
2019-04-11    3.483633e+06
2019-04-12    4.624216e+06
dtype: float64
#skipna参数默认是True 表示排除缺失值
df.mean(axis = 1,skipna = False)
Date
2019-04-01    4.643826e+06
2019-04-02    3.794444e+06
2019-04-03    3.878796e+06
2019-04-04    3.185879e+06
2019-04-05    3.087931e+06
2019-04-08    4.313782e+06
2019-04-09    5.961534e+06
2019-04-10    3.616050e+06
2019-04-11    3.483633e+06
2019-04-12    4.624216e+06
dtype: float64
# 行名字排序
sorted_row_df = df.sort_index()
sorted_row_df.head()
HighLowOpenCloseVolumeAdj Close
Date
2019-04-01191.679993188.380005191.639999191.24000527862000191.240005
2019-04-02194.460007191.050003191.089996194.02000422765700194.020004
2019-04-03196.500000193.149994193.250000195.35000623271800195.350006
2019-04-04196.369995193.139999194.789993195.69000219114300195.690002
2019-04-05197.100006195.929993196.449997197.00000018526600197.000000
# 列名字排序
sorted_col_df = df.sort_index(axis=1)
sorted_col_df.head()
Adj CloseCloseHighLowOpenVolume
Date
2019-04-01191.240005191.240005191.679993188.380005191.63999927862000
2019-04-02194.020004194.020004194.460007191.050003191.08999622765700
2019-04-03195.350006195.350006196.500000193.149994193.25000023271800
2019-04-04195.690002195.690002196.369995193.139999194.78999319114300
2019-04-05197.000000197.000000197.100006195.929993196.44999718526600

常用的方法如上所介绍,还有很多其他的,下面罗列了一些,可供参考:

count 非na值的数量

describe 针对Series或DataFrame列计算汇总统计

min、max 计算最小值和最大值

argmin、argmax 计算能够获取到最大值和最小值得索引位置

idxmin、idxmax 计算能够获取到最大值和最小值得索引值

quantile 计算样本的分位数(0到1)

sum 值的总和

mean 值的平均数

median 值的算术中位数

mad 根据平均值计算平均绝对离差

var 样本值的方差

std 样本值的标准差

skew 样本值的偏度(三阶矩)

kurt 样本值的累积和

cumsum 样本值的累积和

cummin,cummax 样本值的累计最大值和累计最小值

cumprod 样本值的累计积

diff 计算一阶差分

pct_change 计算百分数变化

3 数据规整

Pandas提供了大量的方法能够轻松的对Series,DataFrame和Pannel对象进行各种符号各种逻辑关系的合并操作

concat 可以沿一条轴将多个对象堆叠到一起

append 将一行连接到一个DataFrame上

duolicated 移除重复数据

3.1 数据堆叠concat

df1 = web.DataReader("AAPL","yahoo",datetime.datetime(2019,4,1),datetime.datetime(2019,4,3))
df1
HighLowOpenCloseVolumeAdj Close
Date
2019-04-01191.679993188.380005191.639999191.24000527862000191.240005
2019-04-02194.460007191.050003191.089996194.02000422765700194.020004
2019-04-03196.500000193.149994193.250000195.35000623271800195.350006
df2 = web.DataReader("AAPL","yahoo",datetime.datetime(2019,4,5),datetime.datetime(2019,4,8))
df2
HighLowOpenCloseVolumeAdj Close
Date
2019-04-04196.369995193.139999194.789993195.69000219114300195.690002
2019-04-05197.100006195.929993196.449997197.00000018526600197.000000
2019-04-08200.229996196.339996196.419998200.10000625881700200.100006

纵向拼接(默认):

pd.concat([df1,df2],axis=0)
HighLowOpenCloseVolumeAdj Close
Date
2019-04-01191.679993188.380005191.639999191.24000527862000191.240005
2019-04-02194.460007191.050003191.089996194.02000422765700194.020004
2019-04-03196.500000193.149994193.250000195.35000623271800195.350006
2019-04-04196.369995193.139999194.789993195.69000219114300195.690002
2019-04-05197.100006195.929993196.449997197.00000018526600197.000000
2019-04-08200.229996196.339996196.419998200.10000625881700200.100006

横向拼接,index对不上的用NaN填充

pd.concat([df1,df2],axis=1)
HighLowOpenCloseVolumeAdj CloseHighLowOpenCloseVolumeAdj Close
Date
2019-04-01191.679993188.380005191.639999191.24000527862000.0191.240005NaNNaNNaNNaNNaNNaN
2019-04-02194.460007191.050003191.089996194.02000422765700.0194.020004NaNNaNNaNNaNNaNNaN
2019-04-03196.500000193.149994193.250000195.35000623271800.0195.350006NaNNaNNaNNaNNaNNaN
2019-04-04NaNNaNNaNNaNNaNNaN196.369995193.139999194.789993195.69000219114300.0195.690002
2019-04-05NaNNaNNaNNaNNaNNaN197.100006195.929993196.449997197.00000018526600.0197.000000
2019-04-08NaNNaNNaNNaNNaNNaN200.229996196.339996196.419998200.10000625881700.0200.100006

3.2 数据连接append

df1
HighLowOpenCloseVolumeAdj Close
Date
2019-04-01191.679993188.380005191.639999191.24000527862000191.240005
2019-04-02194.460007191.050003191.089996194.02000422765700194.020004
2019-04-03196.500000193.149994193.250000195.35000623271800195.350006
s = df1.iloc[0]
s
High         1.916800e+02
Low          1.883800e+02
Open         1.916400e+02
Close        1.912400e+02
Volume       2.786200e+07
Adj Close    1.912400e+02
Name: 2019-04-01 00:00:00, dtype: float64
# ignore_index=False 表示索引不变
df1.append(s,ignore_index=False)
HighLowOpenCloseVolumeAdj Close
Date
2019-04-01191.679993188.380005191.639999191.24000527862000.0191.240005
2019-04-02194.460007191.050003191.089996194.02000422765700.0194.020004
2019-04-03196.500000193.149994193.250000195.35000623271800.0195.350006
2019-04-01191.679993188.380005191.639999191.24000527862000.0191.240005
# ignore_index=True 表示索引重置
df1.append(s,ignore_index=True)
HighLowOpenCloseVolumeAdj Close
0191.679993188.380005191.639999191.24000527862000.0191.240005
1194.460007191.050003191.089996194.02000422765700.0194.020004
2196.500000193.149994193.250000195.35000623271800.0195.350006
3191.679993188.380005191.639999191.24000527862000.0191.240005

3.3 移除重复数据duplicated

z = df1.append(s,ignore_index=False)
z
HighLowOpenCloseVolumeAdj Close
Date
2019-04-01191.679993188.380005191.639999191.24000527862000.0191.240005
2019-04-02194.460007191.050003191.089996194.02000422765700.0194.020004
2019-04-03196.500000193.149994193.250000195.35000623271800.0195.350006
2019-04-01191.679993188.380005191.639999191.24000527862000.0191.240005

查看重复数据

z.duplicated()
Date
2019-04-01    False
2019-04-02    False
2019-04-03    False
2019-04-01     True
dtype: bool

移除重复数据

z.drop_duplicates()
HighLowOpenCloseVolumeAdj Close
Date
2019-04-01191.679993188.380005191.639999191.24000527862000.0191.240005
2019-04-02194.460007191.050003191.089996194.02000422765700.0194.020004
2019-04-03196.500000193.149994193.250000195.35000623271800.0195.350006

4 分组

z.groupby("Open").sum()
HighLowCloseVolumeAdj Close
Open
191.089996194.460007191.050003194.02000422765700.0194.020004
191.639999383.359985376.760010382.48001155724000.0382.480011
193.250000196.500000193.149994195.35000623271800.0195.350006
z.groupby(["Open","Close"]).sum()
HighLowVolumeAdj Close
OpenClose
191.089996194.020004194.460007191.05000322765700.0194.020004
191.639999191.240005383.359985376.76001055724000.0382.480011
193.250000195.350006196.500000193.14999423271800.0195.350006
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mind_programmonkey

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值