You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何批量筛选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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 00:20:22