6.数据分析-Pandas_③

本文介绍了Python中数据分析库pandas的高级处理技巧,包括数据合并、交叉表和透视表的使用。通过pd.concat()和pd.merge()函数进行数据合并,展示了内连接、外连接等不同方式。接着,利用交叉表pd.crosstab()统计分类频率,并通过pivot_table()简化分析过程。最后,通过实例演示了分组与聚合操作,如groupby()和聚合函数的运用。
摘要由CSDN通过智能技术生成
import pandas as pd
# pd.Series(data=None,index=None,dtype=None)

import numpy as np
import matplotlib.pyplot as plt
import random
from pylab import mpl
#显示中文字体
mpl.rcParams["font.sans-serif"] = ["SimHei"]
#设置正常显示字符
mpl.rcParams["axes.unicode_minus"] = False

九、高级处理-合并

9.1 pd.concat()数据合并

# pd.concat实现数据合并 
#     pd.concat([data1, data2], axis=1) 
#    按照行或列进行合并,axis=0为列索引,axis=1为行索引
#读取数据表数据
data = pd.read_csv("./2.code/data/stock_day.csv") 
p_change = data['p_change']

#离散化处理得到哑变量矩阵 dummies
bins = [-100, -7, -5, -3, 0, 3, 5, 7, 100] 
p_counts = pd.cut(p_change, bins)
dummies = pd.get_dummies(p_counts, prefix="rise")

#将两个表进行合并(通过行合并)
pd.concat([data,dummies],axis=1).head()
openhighcloselowvolumeprice_changep_changema5ma10ma20...v_ma20turnoverrise_(-100, -7]rise_(-7, -5]rise_(-5, -3]rise_(-3, 0]rise_(0, 3]rise_(3, 5]rise_(5, 7]rise_(7, 100]
2018-02-2723.5325.8824.1623.5395578.030.632.6822.94222.14222.875...55576.112.3900001000
2018-02-2622.8023.7823.5322.8060985.110.693.0222.40621.95522.942...56007.501.5300000100
2018-02-2322.8823.3722.8222.7152914.010.542.4221.93821.92923.022...56372.851.3200001000
2018-02-2222.2522.7622.2822.0236105.010.361.6421.44621.90923.137...60149.600.9000001000
2018-02-1421.4921.9921.9221.4823331.040.442.0521.36621.92323.253...61716.110.5800001000

5 rows × 22 columns

9.2 pd.merge

# pd.merge(left, right, how='inner', on=None) 
# 可以指定按照两组数据的共同键值对合并或者左右各自 
#     left : DataFrame 
#     right : 另一个DataFrame 
#     on : 指定的共同键 
#     how:按照什么方式连接
left = pd.DataFrame({'key1': ['K0', 'K0', 'K1', 'K2'], 'key2': ['K0', 'K1', 'K0', 'K1'], 'A': ['A0', 'A1', 'A2', 'A3'], 'B': ['B0', 'B1', 'B2', 'B3']})
right = pd.DataFrame({'key1': ['K0', 'K1', 'K1', 'K2'], 'key2': ['K0', 'K0', 'K0', 'K0'], 'C': ['C0', 'C1', 'C2', 'C3'], 'D': ['D0', 'D1', 'D2', 'D3']})
# 默认内连接 
pd.merge(left, right, on=['key1', 'key2'])
key1key2ABCD
0K0K0A0B0C0D0
1K1K0A2B2C1D1
2K1K0A2B2C2D2
# 左连接 
pd.merge(left, right, how='left', on=['key1', 'key2'])
key1key2ABCD
0K0K0A0B0C0D0
1K0K1A1B1NaNNaN
2K1K0A2B2C1D1
3K1K0A2B2C2D2
4K2K1A3B3NaNNaN
# 右连接 
pd.merge(left, right, how='right', on=['key1', 'key2'])
key1key2ABCD
0K0K0A0B0C0D0
1K1K0A2B2C1D1
2K1K0A2B2C2D2
3K2K0NaNNaNC3D3
# 外链接
pd.merge(left, right, how='outer', on=['key1', 'key2'])
key1key2ABCD
0K0K0A0B0C0D0
1K0K1A1B1NaNNaN
2K1K0A2B2C1D1
3K1K0A2B2C2D2
4K2K1A3B3NaNNaN
5K2K0NaNNaNC3D3

十、高级处理-交叉表与透视表

# 交叉表:交叉表用于计算一列数据对于另外一列数据的分组个数(用于统计分组频率的特殊透视表)
# pd.crosstab(value1, value2)

# 透视表:透视表是将原有的DataFrame的列分别作为行索引和列索引,然后对指定的列应用聚集函数 
# data.pivot_table()

10.1 数据准备

#1、获取数据,将索引转换成星期几
data = pd.read_csv("./2.code/data/stock_day.csv") 
data['week'] = pd.to_datetime(data.index).weekday

# 2、假如把p_change按照大小去分个类0为界限 升的为1 降的为2
data['posi_neg'] = np.where(data['p_change'] > 0, 1, 0)

# 通过交叉表找寻两列数据的关系 
count = pd.crosstab(data['week'], data['posi_neg'])
# count

# 算数运算,先求和 
sumw = count.sum(axis=1).astype(np.float32) 
sumw

# 进行相除操作,得出比例 
pro = count.div(sumw, axis=0)
pro
posi_neg01
week
00.5040000.496000
10.4198470.580153
20.4621210.537879
30.4921880.507812
40.4645670.535433

10.2 查看效果

pro.plot(kind='bar', stacked=True) 
plt.show()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OAWri3Eo-1625642969986)(output_18_0.png)]

10.3 使用pivot_table(透视表)实现

# 通过透视表,将整个过程变成更简单一些 
data.pivot_table(['posi_neg'], index='week')
posi_neg
week
00.496000
10.580153
20.537879
30.507812
40.535433

十一、高级处理-分组与聚合

# 应用groupby和聚合函数实现数据的分组与聚合
# DataFrame.groupby(key, as_index=False) 
#     key:分组的列数据,可以多个 
# 案例:不同颜色的不同笔的价格数据
col =pd.DataFrame({'color': ['white','red','green','red','green'], 'object': ['pen','pencil','pencil','ashtray','pen'],'price1':[5.56,4.20,1.30,0.56 ,2.75],'price2':[4.75,4.12,1.60,0.75,3.15]})
col
colorobjectprice1price2
0whitepen5.564.75
1redpencil4.204.12
2greenpencil1.301.60
3redashtray0.560.75
4greenpen2.753.15
# 分组,求平均值 
col.groupby(['color'])['price1'].mean()
color
green    2.025
red      2.380
white    5.560
Name: price1, dtype: float64
col['price1'].groupby(col['color']).mean()
color
green    2.025
red      2.380
white    5.560
Name: price1, dtype: float64
# 分组,数据的结构不变 
col.groupby(['color'], as_index=False)['price1'].mean()
colorprice1
0green2.025
1red2.380
2white5.560

十二、资料网盘

百度云盘:https://pan.baidu.com/s/1puAwMn8QFGiUcrmQtnoiPw ;
提取码:echo

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Padaz

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

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

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

打赏作者

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

抵扣说明:

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

余额充值