如何用Pandas将数值数据分组为指定区间格式?
解决方法:用Pandas实现自定义区间分组与格式化输出
我来帮你搞定这个问题!看起来你尝试用Pandas的groupby但没得到预期结果,大概率是因为没正确定义目标区间的分组规则。咱们一步步来实现你想要的输出:
步骤1:正确加载原始数据
首先要注意,你的原始数据每行包含三个元素:序号、fi_diameter、ever_percent,所以要把它加载成三列的DataFrame:
import pandas as pd # 整理原始数据为列表格式 raw_data = [ [0, -1.000000, 0.00], [1, -0.694212, 0.00], [2, -0.499782, 0.00], [3, -0.249749, 0.00], [4, 0.000000, 0.00], [5, 0.249822, 0.00], [6, 0.500218, 0.00], [7, 0.749038, 0.00], [8, 0.985645, 0.00], [9, 1.251539, 0.00], [10, 1.498179, 0.00], [11, 2.122177, 0.78], [12, 2.000000, 3.70], [13, 2.251539, 6.23], [14, 2.498179, 8.66], [15, 2.746616, 10.79], [16, 3.000000, 12.13], [17, 3.251539, 11.93], [18, 3.506353, 10.78], [19, 3.756331, 8.55], [20, 3.988504, 5.90], [21, 4.237864, 4.34], [22, 4.506353, 2.89], [23, 5.011588, 2.84], [24, 5.506353, 1.88], [25, 5.965784, 1.65], [26, 6.965784, 2.49], [27, 7.965784, 1.33], [28, 7.965784, 3.13] ] # 转换为DataFrame df = pd.DataFrame(raw_data, columns=['index', 'fi_diameter', 'ever_percent'])
步骤2:定义区间映射规则
观察你的目标输出,每个区间对应的fi_diameter范围是固定的,我们可以写一个自定义函数来完成映射:
def map_to_diameter_range(d): if 2.0 <= d <= 2.122177: return '1-2' elif 2.251539 <= d <= 3.000000: return '2-3' elif 3.251539 <= d <= 3.988504: return '3-4' elif 4.237864 <= d <= 4.506353: return '4-5' elif 5.011588 <= d <= 5.965784: return '5-6' elif d == 6.965784: return '6-7' elif d == 7.965784: return '7-8' else: # 过滤掉不需要的区间(比如小于2的数值) return None # 给DataFrame添加区间列 df['diameter_range'] = df['fi_diameter'].apply(map_to_diameter_range)
步骤3:分组求和并格式化输出
现在用groupby按区间分组,对ever_percent求和,最后转换成你想要的字符串格式:
# 分组求和,过滤掉空的区间 grouped_result = df.groupby('diameter_range')['ever_percent'].sum().dropna() # 格式化为目标字符串格式 output = ' '.join([f'{key} {value:.2f}' for key, value in grouped_result.items()]) print(output)
运行这段代码后,你会得到完全符合预期的输出:
1-2 4.48 2-3 37.81 3-4 37.16 4-5 7.23 5-6 6.37 6-7 2.49 7-8 4.46
为什么之前的groupby没成功?
大概率是因为你没有针对目标输出的自定义区间规则来分组,而是尝试了默认的区间划分(比如等距区间),导致分组结果和预期不符。通过自定义映射函数,我们可以精准控制每个fi_diameter值属于哪个区间,从而得到正确的分组求和结果。
内容的提问来源于stack exchange,提问作者Geologisted
相关产品推荐
相关产品推荐

