Pandas8_高级处理-数据离散化和数据合并

import numpy as np
import pandas as pd

数据离散化

什么是数据离散化?

  • 连续属性的离散化就是在连续属性的值域上,将值域划分为若干个离散的区间,最后用不同的符号或整数 值代表落在每个子区间中的属性值。

  • 离散化有很多种方法,这使用一种最简单的方式去操作,例如:

  • 原始人的身高数据:165,174,160,180,159,163,192,184

  • 假设按照身高分几个区间段:150~165, 165180,180195

  • 这样我们将数据分到了三个区间段,我可以对应的标记为矮、中、高三个类别,最终要处理成一个"哑变量"矩阵

# 股票的涨跌幅离散化

读取股票数据

data = pd.read_csv("./data/stock_day.csv")
p_change = data["p_change"]
p_change
2018-02-27    2.68
2018-02-26    3.02
2018-02-23    2.42
2018-02-22    1.64
2018-02-14    2.05
              ... 
2015-03-06    8.51
2015-03-05    2.02
2015-03-04    1.57
2015-03-03    1.44
2015-03-02    2.62
Name: p_change, Length: 643, dtype: float64

将股票涨跌幅数据进行分组

自动分组 pd.qcut(data, q):

对数据进行分组自动分组,q是分组的个数,一般会与value_counts搭配使用,统计每组的个数
  • series.value_counts():统计每组个数
# 自行分组
qcut = pd.qcut(p_change,10)
# 分到每组的个数
qcut.value_counts()
(5.27, 10.03]                    65
(0.26, 0.94]                     65
(-0.462, 0.26]                   65
(-10.030999999999999, -4.836]    65
(2.938, 5.27]                    64
(1.738, 2.938]                   64
(-1.352, -0.462]                 64
(-2.444, -1.352]                 64
(-4.836, -2.444]                 64
(0.94, 1.738]                    63
Name: p_change, dtype: int64

自定义区间分组 pd.cut(data, bins)

# 自定义分组区间
bins = [-100, -7, -5, -3, 0, 3, 5, 7, 100]
p_counts = pd.cut(p_change, bins)
# p_counts
p_counts.value_counts()
(0, 3]        215
(-3, 0]       188
(3, 5]         57
(-5, -3]       51
(7, 100]       35
(5, 7]         35
(-100, -7]     34
(-7, -5]       28
Name: p_change, dtype: int64

股票涨跌幅分组数据变成one-hot编码

  • 什么是one-hot编码

    把每个类别生成一个布尔列,这些列中只有一列可以为这个样本取值为1.其又被称为热编码。

  • pd.get_dummies(data, prefix=None)

    • data:array-like, Series, or DataFrame
    • prefix:分组名字
dummies = pd.get_dummies(p_counts,prefix='rise')
dummies.head()
rise_(-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-2700001000
2018-02-2600000100
2018-02-2300001000
2018-02-2200001000
2018-02-1400001000

数据合并

使用pd.concat实现数据合并

  • pd.concat([data1, data2], axis=1)
  • 按照行或列进行合并,axis=0为列索引,axis=1为行索引
# 将刚才处理好的one-hot编码与原数据按照行合并
result = pd.concat([data,dummies], axis=1)
result
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
..................................................................
2015-03-0613.1714.4814.2813.13179831.721.128.5113.11213.11213.112...115090.186.1600000001
2015-03-0512.8813.4513.1612.8793180.390.262.0212.82012.82012.820...98904.793.1900001000
2015-03-0412.8012.9212.9012.6167075.440.201.5712.70712.70712.707...100812.932.3000001000
2015-03-0312.5213.0612.7012.52139071.610.181.4412.61012.61012.610...117681.674.7600001000
2015-03-0212.2512.6712.5212.2096291.730.322.6212.52012.52012.520...96291.733.3000001000

643 rows × 22 columns

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']})
left
key1key2AB
0K0K0A0B0
1K0K1A1B1
2K1K0A2B2
3K2K1A3B3

right = pd.DataFrame({'key1': ['K0', 'K1', 'K1', 'K2'],
                        'key2': ['K0', 'K0', 'K0', 'K0'],
                        'C': ['C0', 'C1', 'C2', 'C3'],
                        'D': ['D0', 'D1', 'D2', 'D3']})
right
key1key2CD
0K0K0C0D0
1K1K0C1D1
2K1K0C2D2
3K2K0C3D3
# 默认内连接,按照共同键值对合并,即按照键值对的交集
result = pd.merge(left, right, on=['key1', 'key2'])
result
key1key2ABCD
0K0K0A0B0C0D0
1K1K0A2B2C1D1
2K1K0A2B2C2D2
# 外连接,按照键值对的并集进行合并
result = pd.merge(left, right, on=['key1', 'key2'], how='outer')
result
key1key2ABCD
0K0K0A0B0C0D0
1K0K1A1B1NaNNaN
2K1K0A2B2C1D1
3K1K0A2B2C2D2
4K2K1A3B3NaNNaN
5K2K0NaNNaNC3D3

# 左连接,按照左边数据的键值对合并
result = pd.merge(left, right, on=['key1', 'key2'], how='left')
result
key1key2ABCD
0K0K0A0B0C0D0
1K0K1A1B1NaNNaN
2K1K0A2B2C1D1
3K1K0A2B2C2D2
4K2K1A3B3NaNNaN
# 右连接,按照右边数据的键值对合并
result = pd.merge(left, right, on=['key1', 'key2'], how='right')
result
key1key2ABCD
0K0K0A0B0C0D0
1K1K0A2B2C1D1
2K1K0A2B2C2D2
3K2K0NaNNaNC3D3

总结:

  • pd.concat([数据1, 数据2], axis=**)
  • pd.merge(left, right, how=, on=)
  • how – 以何种方式连接
  • on – 连接的键的依据是哪几个
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

GJ_WL

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

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

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

打赏作者

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

抵扣说明:

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

余额充值