如何批量筛选DataFrame各列的10步长区间值并统计行数?
高效处理DataFrame列的区间统计与绘图
一、批量统计各列的区间行数
不用手动逐个设置筛选条件,Pandas的pd.cut()可以快速给数值分配区间,结合apply()和value_counts()就能一键统计所有列的各区间行数:
import numpy as np import pandas as pd import matplotlib.pyplot as plt # 生成示例数据 df = pd.DataFrame(np.random.randint(0, 100, size=(100, 10)), columns=list('ABCDEFGHIJ')) # 定义区间:0-10、10-20...90-100 bins = range(0, 101, 10) labels = [f"{i}-{i+10}" for i in range(0, 100, 10)] # 统计每列各区间的行数 interval_counts = df.apply( lambda col: pd.cut(col, bins=bins, labels=labels, include_lowest=True).value_counts().sort_index() ) print(interval_counts)
include_lowest=True确保第一个区间包含0(默认pd.cut是左开右闭,设置后第一个区间变为[0,10],其余为(10,20]等,匹配你的区间需求)sort_index()保证区间按0-10、10-20的顺序排列
二、批量筛选各列的区间数据
如果需要提取每个列的每个区间数据,可以用字典统一存储,避免重复代码:
# 存储所有列的区间数据,键格式为"列名_区间" interval_data = {} for col in df.columns: # 给当前列的每个值分配区间标签 col_interval_labels = pd.cut(df[col], bins=bins, labels=labels, include_lowest=True) # 遍历每个区间,筛选对应数据 for label in labels: interval_data[f"{col}_{label}"] = df[col][col_interval_labels == label] # 示例:获取A列0-10区间的数据 print(interval_data["A_0-10"])
三、统一绘制所有区间的可视化图
1. 每列单独绘制区间分布
用子图展示每列的区间计数:
fig, axes = plt.subplots(nrows=2, ncols=5, figsize=(15, 8)) axes = axes.flatten() for idx, col in enumerate(df.columns): # 获取当前列的区间计数 col_counts = pd.cut(df[col], bins=bins, labels=labels, include_lowest=True).value_counts().sort_index() # 绘制柱状图 col_counts.plot(kind='bar', ax=axes[idx], title=f"Column {col}") axes[idx].set_xlabel("Interval") axes[idx].set_ylabel("Count") plt.tight_layout() plt.show()
2. 跨列对比同一区间的计数
将数据转为长格式后,绘制各列在同一区间的对比图:
# 把宽表转成适合分组统计的长表 melted_df = df.melt(var_name='Column', value_name='Value') # 添加区间标签列 melted_df['Interval'] = pd.cut(melted_df['Value'], bins=bins, labels=labels, include_lowest=True) # 统计每个区间下各列的行数 cross_counts = melted_df.groupby(['Interval', 'Column']).size().unstack() # 绘制对比柱状图 cross_counts.plot(kind='bar', figsize=(12, 6), stacked=False) plt.xlabel("Interval") plt.ylabel("Count") plt.title("Interval Counts by Column") plt.legend(title='Column') plt.show()
以上方法完全避免了手动编写100个筛选条件,利用Pandas的向量化操作和分组能力实现批量处理,效率远高于手动操作。
内容的提问来源于stack exchange,提问作者ignotus
相关产品推荐
相关产品推荐

