如何用Pythonic方式对粒子分组应用自定义类生成合并DataFrame
问题:批量处理粒子运动学数据
我有一个记录粒子集合轨迹的DataFrame:
t = y x mass ... ep frame particle 0 19.786517 1000.656583 8673.042534 ... 0.078461 0 0 376 1424.723047 216.250029 14354.289353 ... 0.108937 0 1 375 1426.538703 1564.423771 11674.833112 ... 0.130680 0 2 374 1428.278151 2018.516185 18706.219367 ... 0.075380 0 3 373 1426.137787 626.417419 20111.330551 ... 0.060769 0 4 ... ... ... ... ... ... ... 750968 717.455045 170.929977 12260.771171 ... 0.027305 1364 2896 750967 718.018964 926.256111 14161.143811 ... 0.019303 1364 5743 750966 709.771559 239.818120 17578.233781 ... 0.018574 1364 6599 750980 758.318235 1232.281636 7943.370072 ... 0.041535 1364 6228 751327 2029.563012 1472.951389 11750.935891 ... 0.051639 1364 6253 [751328 rows x 10 columns]
我开发了Particle_Kinematics类,传入单个粒子的DataFrame(比如粒子2)后,会返回包含速度、角度等运动学属性的新DataFrame:
gb = t.groupby('particle') p2_df = gb.get_group(2) PK = Particle_Kinematics(p2_df, n=0.5) PK_df = PK.to_df()
处理后的PK_df包含以下列:
PK_df.columns = ['y', 'x', 'mass', ..., 'v_y', 'v_x', 'v', 'angle']
请问有没有Pythonic的方式,对所有粒子批量应用这个类,最终合并成一个完整的总DataFrame?我查了GroupBy文档,没找到合适的聚合或转换方法。
解决方案
可以用GroupBy.apply()方法实现批量处理,这是最符合Python风格的方案之一。apply()会遍历每个粒子分组,对单个粒子的DataFrame执行自定义逻辑,最后自动合并所有处理结果。
具体实现代码:
def process_single_particle(df): # 初始化运动学类并返回处理后的DataFrame pk_instance = Particle_Kinematics(df, n=0.5) return pk_instance.to_df() # 对所有粒子分组批量处理,自动合并结果 full_processed_df = t.groupby('particle').apply(process_single_particle) # 重置索引(可选,移除多级索引,让结构更简洁) full_processed_df = full_processed_df.reset_index(drop=True)
关键说明:
apply()会自动把每个粒子的子DataFrame传入process_single_particle函数- 函数内部完成
Particle_Kinematics的初始化和结果转换 - 所有处理后的子DataFrame会被无缝拼接成一个大的DataFrame,保留原有的轨迹和新增的运动学属性
- 如果你的
Particle_Kinematics类已经保留了particle列,可根据需求选择是否重置索引
内容的提问来源于stack exchange,提问作者J.Pottiez
相关产品推荐
相关产品推荐

