You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 14:22:35