基于JSON数据聚合Pandas DataFrame:按Year计算Val中位数
解决JSON字符串列的聚合计算问题
步骤1:解析JSON字符串并展开为结构化数据
首先需要把DataFrame中存储的JSON字符串转换为可处理的结构化格式,将每个JSON中的year和val数组展开为一一对应的行:
import json import pandas as pd import numpy as np # 示例数据 data = { 'id': [1, 2, 3], 'name': ['geo1', 'geo2', 'geo3'], 'json_data': [ '{"year": [2000, 2001, 2002], "val": [10, 20, 30]}', '{"year": [2000, 2001, 2005], "val": [50, 60, 70]}', '{"year": [2000, 2001, 2002], "val": [80, 90, 85]}' ] } df = pd.DataFrame(data) # 解析JSON字符串为Python字典 df['json_data'] = df['json_data'].apply(json.loads) # 将每个字典中的year和val数组展开为多行DataFrame expanded_dfs = [] for _, row in df.iterrows(): temp_df = pd.DataFrame({ 'year': row['json_data']['year'], 'val': row['json_data']['val'] }) expanded_dfs.append(temp_df) # 合并所有展开后的DataFrame df_flat = pd.concat(expanded_dfs, ignore_index=True)
步骤2:按year聚合并计算向上取整的中位数
接下来按year分组,计算val的中位数,并对偶数个数据的情况做向上取整处理,最终保留整数结果:
# 分组计算:先求中位数,再向上取整并转为整数 result = df_flat.groupby('year', as_index=False)['val'].agg( lambda x: int(np.ceil(np.median(x))) ) # 输出结果 print(result)
输出结果
year val 0 2000 50 1 2001 60 2 2002 58 3 2005 70
说明
- 解析JSON时,通过
json.loads将字符串转为字典,再通过循环把每个字典的数组拆分为多行,确保year和val一一对应。 - 聚合时使用
np.median计算中位数,再用np.ceil实现向上取整,最后转为整数,满足偶数个数据时向上取整的要求。
内容的提问来源于stack exchange,提问作者kms
相关产品推荐
相关产品推荐

