Pandas多列分组求和生成spikes二维数组实现方法
按trial_time和bin_time分组聚合spikes生成二维统计数组
问题描述
现有千行级记录的DataFrame,样例数据如下:
cluster_id bin_time trial_time spikes 1 0 0.5 1 2 5 0.7 0 6 0 0.5 5 3 5 0.7 0 2 5 0.5 1 8. 0. 0.7. 0
数据前三列存在重复值,处理要求:
- 直接丢弃
cluster_id维度,不需要基于该字段做拆分统计 - 对每一组唯一的
trial_time+bin_time组合,计算组内所有spikes的总和 - 最终输出纯数值二维numpy数组:Y轴对应唯一
trial_time值,X轴对应唯一bin_time值,元素为对应分组的spikes求和结果
之前的无效尝试
曾使用如下代码实现,但结果中每个trial_time分组下仍保留了cluster_id带来的重复值,不符合预期:
new_df = groupby('trial_time')['spikes'].apply(lambda x: list(x))
样例预期计算结果
针对给出的样例,各分组计算逻辑为:
- trial_time=0.5、bin_time=0:spikes总和=1+5=6
- trial_time=0.5、bin_time=5:spikes总和=1
- trial_time=0.7、bin_time=0:spikes总和=0
- trial_time=0.7、bin_time=5:spikes总和=0+0=0
最终二维数组仅保留上述统计数值即可。
实现代码
核心逻辑是先按两个分组维度做聚合求和,再通过unstack将行索引转列索引生成宽表,最后转numpy数组即可,注意提前清洗数值列的格式异常(比如样例中带多余小数点的8./0.7.这类值,先转成标准浮点型避免分组错误):
# 先清洗数值列,处理格式异常 for col in ['bin_time', 'trial_time', 'spikes']: df[col] = pd.to_numeric(df[col], errors='coerce').fillna(0) # 双维度分组求和,unstack转成行为trial_time、列为bin_time的矩阵,缺失值填0 pivot_df = df.groupby(['trial_time', 'bin_time'], as_index=True)['spikes'].sum().unstack(fill_value=0) # 转成目标二维numpy数组 result = pivot_df.to_numpy()
针对样例数据,运行后result输出为:
array([[6, 1], [0, 0]])
说明:数组行默认按trial_time升序排列(0.5、0.7),列默认按bin_time升序排列(0、5),和预期计算结果完全一致。如果需要自定义轴的顺序,提前对DataFrame对应字段做排序后再分组即可。
内容的提问来源于stack exchange,提问作者Joan
相关产品推荐
相关产品推荐

