如何利用DataFrame中A列的Decile断点统计多列行数并简化实现?
简化版解决方案:批量处理多列的十分位统计
嘿,我懂你面对大量列时,手动写一堆loc区间判断有多崩溃——咱们来把这个流程彻底简化,让它能轻松适配多列场景!
核心思路
- 一次性获取A列的十分位断点:用
pd.qcut的retbins=True参数直接拿到分箱边界,不用再从分组结果里手动提取最大值。 - 用统一断点批量分箱:拿到断点后,用
pd.cut给所有需要统计的列(比如B、C、D...)自动分箱,替换掉繁琐的手动区间判断。 - 批量统计合并结果:通过循环处理多列,自动生成每列的分箱计数,再合并成最终表格。
具体代码实现
第一步:读取数据并获取A列的十分位断点
import pandas as pd import numpy as np # 读取Excel文件(注意路径前面加r避免转义问题) df = pd.read_excel(r"E:\Sai\Development\UCG\qcut.xlsx") # 对A列做10分位划分,同时返回分箱断点(retbins=True) _, a_bins = pd.qcut(df['a'], 10, retbins=True) # 可选:把首尾边界设为正负无穷,确保所有数据都能被分箱(避免极端值漏判) a_bins[0] = -np.inf a_bins[-1] = np.inf
第二步:对A列和目标列批量分箱
# 给A列添加1-10的分箱标签 df['a_decile'] = pd.cut(df['a'], bins=a_bins, labels=range(1, 11)) # 假设要统计的列是B,这里可以扩展到多列 target_cols = ['b'] # 后续加其他列直接往列表里加就行,比如['b', 'c', 'd'] # 循环给每个目标列分箱 for col in target_cols: df[f'{col}_decile'] = pd.cut(df[col], bins=a_bins, labels=range(1, 11))
第三步:统计并合并结果
# 统计A列各分箱的行数 count_a = df['a_decile'].value_counts().sort_index().rename('count_A').reset_index() count_a = count_a.rename(columns={'index': 'decile'}) # 初始化最终结果表 final_result = count_a # 循环统计每个目标列的分箱行数,合并到结果表 for col in target_cols: count_col = df[f'{col}_decile'].value_counts().sort_index().rename(f'count_{col.upper()}').reset_index() count_col = count_col.rename(columns={'index': 'decile'}) final_result = pd.merge(final_result, count_col, on='decile') # 添加区间范围列(可选,根据需求调整小数位数) final_result['Range'] = [f"{a_bins[i]:.2f} → {a_bins[i+1]:.2f}" for i in range(len(a_bins)-1)] # 调整列顺序,让结果更清晰 final_result = final_result[['Range', 'decile', 'count_A'] + [f'count_{col.upper()}' for col in target_cols]]
为什么这个方案更优?
- 避免手动区间错误:不用再写一堆
(df['b']>x) & (df['b']<=y)的判断,减少写错区间的概率。 - 轻松扩展多列:只要往
target_cols列表里加列名,就能自动完成所有列的统计,完全适配大量列的场景。 - 逻辑更清晰:从获取断点→分箱→统计的流程一目了然,后续维护也更方便。
小提示
如果你的数据里有缺失值,可以在value_counts里加dropna=False参数,保留缺失值的统计结果:
count_a = df['a_decile'].value_counts(dropna=False).sort_index().rename('count_A').reset_index()
内容的提问来源于stack exchange,提问作者Venky
相关产品推荐
相关产品推荐

