如何基于另一DataFrame的分箱条件统计DataFrame中的值频次?
解决DataFrame分箱降雨频次统计的报错与逻辑问题
报错原因
你用df2.iloc[i]取出的是带索引的Series(索引为bin limits),而rain的索引是多层索引(longitude/latitude/year),两者索引不匹配,直接比较就会触发ValueError: Can only compare identically-labeled Series objects。同时你的循环逻辑只判断了rain>limit,没有处理分箱的区间范围,统计逻辑不正确。
正确解法
方法1:修正循环逻辑
先把分箱上限提取为标量列表,然后逐个统计每个区间的频次:
import pandas as pd # 提取分箱上限为列表 limits = df2['bin limits'].tolist() rain = df1['tp1'] counts = [] # 第一个分箱:降雨值 <= 第一个上限 counts.append(len(rain[rain <= limits[0]])) # 中间分箱:降雨值 > 前一个上限 且 <= 当前上限 for i in range(1, len(limits)): mask = (rain > limits[i-1]) & (rain <= limits[i]) counts.append(len(rain[mask])) # 将统计结果赋值给df2 df2['count'] = counts
方法2:用pandas.cut高效实现
利用pandas内置的分箱函数cut,更简洁高效:
import pandas as pd limits = df2['bin limits'].tolist() # 定义分箱边界:左边界设为0(降雨非负),加上所有上限,最后加无穷大覆盖剩余值 bins = [0] + limits + [float('inf')] # 对降雨数据分箱 rain_bins = pd.cut(df1['tp1'], bins=bins) # 统计每个箱的频次并排序 bin_counts = rain_bins.value_counts().sort_index() # 将对应区间的频次赋值给df2(去掉最后一个无穷大区间的统计) df2['count'] = bin_counts.values[:-1]
验证结果
根据你提供的df1数据,最终df2的count列结果应为:
| bin limits | count |
|---|---|
| 16.655970 | 2 |
| 18.204842 | 4 |
| 19.526524 | 1 |
| 20.852657 | 1 |
| 22.336731 | 1 |
| 24.211905 | 1 |
| 27.143820 | 2 |
内容的提问来源于stack exchange,提问作者jw99
相关产品推荐
相关产品推荐

