【Pandas驯化-11】一文搞懂Pandas中的分组函数groupby与qcut、fillna使用
本次修炼方法请往下查看
🌈 欢迎莅临我的个人主页 👈这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合,智慧小天地!
🎇 相关内容文档获取 微信公众号
🎇 相关内容视频讲解 B站
🎓 博主简介:AI算法驯化师,混迹多个大厂搜索、推荐、广告、数据分析、数据挖掘岗位 个人申请专利40+,熟练掌握机器、深度学习等各类应用算法原理和项目实战经验。
🔧 技术专长: 在机器学习、搜索、广告、推荐、CV、NLP、多模态、数据分析等算法相关领域有丰富的项目实战经验。已累计为求职、科研、学习等需求提供近千次有偿|无偿定制化服务,助力多位小伙伴在学习、求职、工作上少走弯路、提高效率,近一年好评率100% 。
📝 博客风采: 积极分享关于机器学习、深度学习、数据分析、NLP、PyTorch、Python、Linux、工作、项目总结相关的实用内容。
🌵文章目录🌵
- 🎯 1. 基本介绍
- 💡 2. 使用方法
- 2.1 cut函数使用
- 2.2 qcut函数使用
- 2.3 高级用法
- 2.4 和fillna连用
- 🔍 3. 注意事项
- 🔧 4. 总结
下滑查看解决方法
🎯 1. 基本介绍
对于分箱操作,在处理连续数据的特征工程时经常会用到,特别是在用户评分模型里面用的贼多,但是使用最优分箱进行数值离散化比较多。
在数据分析中,经常需要根据某些特征将数据分组,并在每个组内执行计算或分析。Pandas 提供了 groupby 功能来实现这一点。此外,qcut 可用于将连续数据分箱为离散区间,而 fillna 用于填充数据中的缺失值。
💡 2. 使用方法
2.1 cut函数使用
在进行特征工程时,经常需要按照一定的规则进行统计特征提取,这个gropuby操作和hadoop的mapreduce有一定的相似,groupby可以理解为对数据进行拆分再进行应用再进行合并,当理解了之前介绍的几个骚函数以及一些常用的统计函数然后如果能想象的到groupby之后的数据结构,基本就可以开始你无限的骚操作了,不管是解决产品经理的数据报告需求还是特征提取基本问题不大了,下面介绍一些个人比较喜欢用的操作:
import pandas as pd
df = pd.DataFrame({
'a': ['A', 'B', 'A', 'C', 'B', 'C', 'A'],
'b': [1, 2, 3, 4, 5, 6, 7],
'c': [10, 20, 30, 40, 50, 60, 70]
})
a b
0 12.05155 49.744408
1 67.84977 33.425537
2 53.72848 91.631309
3 45.52130 22.993242
4 28.46236 53.725090
使用 pd.cut列进行分箱。
# 为等距分箱
bins_1 = pd.cut(df['a'], 4)
print("等距分箱结果:")
print(bins_1.value_counts())
等距分箱结果:
a count
0 (29.071, 52.552] 31
1 (52.552, 76.032] 25
2 (5.497, 29.071] 22
3 (76.032, 99.513] 22
2.2 qcut函数使用
使用 pd.qcut列进行分箱,注意里面的参数labels为是否显示具体为:
# 为等频分箱
bins_2 = pd.qcut(df['a'], 4)
print("\n等频分箱结果:")
print(bins_2.value_counts())
等频分箱结果:
a count
0 (0.197, 28.495] 25
1 (28.495, 49.768] 25
2 (49.768, 72.88] 25
3 (72.88, 98.583] 25
2.3 高级用法
按箱子分组并应用统计函数。使用 groupby 和 apply 对 ‘b’ 列按箱子分组,并应用 help_static 函数。具体的用法如下所示:
def help_static(group):
return {
'max': group.max(),
'mean': group.mean(),
'count': group.count()
}
# 等距分箱统计
temp_1 = df.groupby(bins_1).apply(help_static).unstack()
print("\n等距分箱统计结果:")
print(temp_1)
# 等频分箱统计
temp_2 = df.groupby(bins_2).apply(help_static).unstack()
print("\n等频分箱统计结果:")
print(temp_2)
等距分箱统计结果:
max mean count
0 89.668916 42.667183 25
1 96.302655 55.310322 25
2 95.345022 59.836174 25
3 97.875800 76.837120 25
等频分箱统计结果:
max mean count
0 98.989428 46.483636 25
1 99.994949 67.079796 25
2 100.000000 87.500000 25
3 99.999998 98.000000 1 # 注意:最顶端可能只有一个数据点
2.4 和fillna连用
- 对于空值,在进行特征工程时,如果空值缺比较多的时候,常将这一列删除,如果缺的20%左右,要不就不对其进行处理,
- 将它当做一种情况看待,或者对空值进行填充,为了更加的使填充值得误差尽可能得小,如果一个id有多条样本,则可以对其进行分组后在填充,不然就用整体分布值进行填充。
- 在数据分析中,处理缺失值是一个常见且重要的任务。Pandas 提供了多种方法来填充缺失值,包括使用统计方法(如中位数)或数学模型(如线性插值)。
import pandas as pd
import numpy as np
# 创建包含缺失值的 DataFrame
df = pd.DataFrame({
'a': ['A', 'B', 'A', 'B', 'A', 'B', 'A'],
'b': [1, 2, np.nan, 4, 5, np.nan, 7]
})
# 对列a分组后对列b中的空值用用中位数填充
fuc_nan_median = lambda x: x.fillna(x.median())
# 对列 'b' 分组后填充缺失值
df_median_filled = df.groupby('a')['b'].apply(fuc_nan_median).reset_index()
print(df_median_filled)
a b
0 A 4.0
1 B 3.0
2 A 4.0
3 B 3.0
4 A 4.0
5 B 3.0
6 A 4.0
定义一个 lambda 函数,使用插值方法填充缺失值。
func_nan_interpolate = lambda x: x.interpolate()
# 对列 'b' 分组后使用线性插值填充缺失值
df_interpolated = df.groupby('a')['b'].apply(func_nan_interpolate).reset_index()
print(df_interpolated)
a b
0 A 1.0
1 B 2.0
2 A 3.5
3 B 4.0
4 A 5.5
5 B NaN # 注意:由于B组最后一个值后没有数据,插值无法进行
6 A 7.0
🔍 3. 注意事项
对上述的各个函数在使用的过程中需要注意的一些事项,不然可能会出现error,具体主要为:
- 在使用 fillna 时,确保使用中位数或其他统计量填充是有意义的,并且适用于数据的分布特性。
- interpolate 方法提供了多种插值方法,如 ‘linear’, ‘polynomial’ 等,可以通过 method 参数指定。
- 使用 groupby 后,如果直接对结果使用 reset_index,可能会得到一个额外的列(如 ‘level_1’),这列可能需要被删除。
- 在使用 pd.cut 或 pd.qcut 时,labels=False 表示返回的分箱标签是数字而不是字符串。
- groupby.apply 可以应用任何函数,包括自定义函数,返回的结果将根据函数返回的数据结构进行调整。
- 使用 unstack 可以调整多级列索引的布局,使其更易于理解。
🔧 4. 总结
本文介绍了如何使用 Pandas 对数值型数据进行分箱,并在每个箱子中统计另一列的统计特征。通过实际的代码示例,展示了等距分箱和等频分箱的方法,以及如何定义自定义函数来计算所需的统计量。这些技术在数据分析中非常有用,特别是在处理分布不均匀的数据时。希望这篇博客能够帮助你更好地理解并应用 Pandas 的分箱和分组统计功能。
展示了如何使用中位数和插值方法来填充缺失值,并提供了相应的代码示例和输出结果。这些技术对于数据清洗和准备阶段非常重要,可以帮助提高数据分析的质量和准确性。希望这篇博客能够帮助你更好地理解并应用这些功能。