Python Pandas学习之数据离散化与合并详解
什么是数据离散化
数据离散化是指将连续型数据按照一定的方法划分为离散型数据的过程。例如,我们可以将一组年龄数据按照一定的划分标准,划分为儿童、青少年、成年人和老年人等几个离散的类别。
数据离散化的原因
数据离散化常常是为了更好的进行数据分析和建模,例如:
- 减小噪声的影响
- 降低数据复杂度,简化模型
- 方便进行数据可视化
数据离散化的方法
等宽法
等宽法是指将数据按照数值范围均分为几个等宽的区间,例如,我们将一组数值依次排序,并按照值的范围分成k个等宽的区间,这就是等宽法。
import pandas as pd
import numpy as np
# 构建一个包含100个[0, 100)之间随机数的Series
s = pd.Series(np.random.randint(0, 100, size=100))
# 等宽法离散化,将数据分成5个等宽的区间
res = pd.cut(s, bins=5)
print(res.value_counts().sort_index())
输出结果:
(-0.1, 20.0] 22
(20.0, 40.0] 24
(40.0, 60.0] 22
(60.0, 80.0] 16
(80.0, 99.0] 16
等频法
等频法是指将数据分成k组时,每组的数据个数应该相等,例如,我们将一组数值依次排序,并将其分成5组,每组中包含相等数量的数据,这就是等频法。
# 等频法离散化,将数据分成5组,每组包含20个数值
res = pd.qcut(s, q=5)
print(res.value_counts().sort_index())
输出结果:
(-0.001, 20.0] 20
(20.0, 38.0] 20
(38.0, 53.0] 20
(53.0, 73.0] 20
(73.0, 99.0] 20
自定义分组法
自定义分组法是指根据领域知识或者业务需求,将连续型数据分组为离散型数据。例如,我们可以根据产品价格,将产品分为低、中、高三个档次。
# 自定义分组法离散化,根据价格将商品分为三个档次:“低价格”、“中价格”和“高价格”
df = pd.DataFrame({
'name': ['A', 'B', 'C', 'D', 'E'],
'price': [10, 15, 20, 25, 30]
})
bins = [0, 15, 25, 100]
labels = ['低价格', '中价格', '高价格']
df['category'] = pd.cut(df['price'], bins=bins, labels=labels)
print(df)
输出结果:
name price category
0 A 10 低价格
1 B 15 低价格
2 C 20 中价格
3 D 25 中价格
4 E 30 高价格
合并数据
在数据分析和建模的过程中,经常需要合并多个数据集,例如,我们可以将多个Excel文件合并为一个,或者将多个表格中的数据合并为一个新的数据集。
concat
concat
函数可以沿着一个轴将多个数据集组合在一起,例如,我们可以将三个DataFrame对象沿着行轴(axis=0),按照行标签进行合并,同样也可以沿着列轴(axis=1)进行合并。
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']})
df2 = pd.DataFrame({'A': ['A4', 'A5', 'A6', 'A7'],
'B': ['B4', 'B5', 'B6', 'B7'],
'C': ['C4', 'C5', 'C6', 'C7'],
'D': ['D4', 'D5', 'D6', 'D7']})
df3 = pd.DataFrame({'A': ['A8', 'A9', 'A10', 'A11'],
'B': ['B8', 'B9', 'B10', 'B11'],
'C': ['C8', 'C9', 'C10', 'C11'],
'D': ['D8', 'D9', 'D10', 'D11']})
frames = [df1, df2, df3]
# 沿着行轴进行合并
result = pd.concat(frames)
print(result)
输出结果:
A B C D
0 A0 B0 C0 D0
1 A1 B1 C1 D1
2 A2 B2 C2 D2
... ... ... ... ...
9 A9 B9 C9 D9
10 A10 B10 C10 D10
11 A11 B11 C11 D11
[12 rows x 4 columns]
merge
merge
函数可以将两个DataFrame对象合并为一个,这两个对象需要至少有一个相同的列。
例如,我们可以将两个订单表按照订单编号进行合并,合并后的表格中保留两个表格中都有的列,并可以自定义合并方式(如inner、outer、left、right),也可以自定义列名。
df1 = pd.DataFrame({'order_id': [101, 102, 103, 104],
'customer_id': ['A1', 'A2', 'A3', 'A4'],
'order_date': ['2022-01-01', '2022-01-02', '2022-01-03', '2022-01-04'],
'total_price': [100, 200, 300, 400]})
df2 = pd.DataFrame({'order_id': [101, 102, 105, 106],
'customer_id': ['A1', 'A2', 'A5', 'A6'],
'order_date': ['2022-01-01', '2022-01-02', '2022-01-05', '2022-01-06'],
'total_price': [100, 200, 500, 600]})
# 按照订单编号进行合并
result = pd.merge(df1, df2, on='order_id', how='outer', suffixes=('_df1', '_df2'))
print(result)
输出结果:
order_id customer_id_df1 order_date_df1 total_price_df1 customer_id_df2 order_date_df2 total_price_df2
0 101 A1 2022-01-01 100.0 A1 2022-01-01 100.0
1 102 A2 2022-01-02 200.0 A2 2022-01-02 200.0
2 103 A3 2022-01-03 300.0 NaN NaN NaN
3 104 A4 2022-01-04 400.0 NaN NaN NaN
4 105 NaN NaN NaN A5 2022-01-05 500.0
5 106 NaN NaN NaN A6 2022-01-06 600.0
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python Pandas学习之数据离散化与合并详解 - Python技术站