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

如何合并多份2列Pandas DataFrame并按ID计算值的中位数?

合并多列DataFrame并按ID计算中位数

问题描述

我有一个包含多个2列Pandas DataFrame的列表,每个DataFrame的第一列是ID(列名#id),第二列是对应数值。需要合并这些DataFrame,将相同ID对应的数值替换为它们的中位数。

示例输入

import pandas as pd

df_1 = pd.DataFrame({'#id': [1,2,3,4], 'values_1': [1,3,4,3]})
df_2 = pd.DataFrame({'#id': [1,2,3,5], 'values_2': [2,5,7,6]})
df_3 = pd.DataFrame({'#id': [1,2,4,5], 'values_3': [5,6,7,8]})

期望输出

answer = pd.DataFrame({'#id': [1,2,3,4,5], 'values': [2,5,5.5,5,7]})

解决方案

方法一:合并后转长格式计算

通过外连接合并所有DataFrame,再将数值列转为长格式,最后按ID分组计算中位数:

import pandas as pd

# 构建DataFrame列表
df_list = [df_1, df_2, df_3]

# 按#id外连接合并所有DataFrame
merged_df = df_list[0]
for df in df_list[1:]:
    merged_df = merged_df.merge(df, on='#id', how='outer')

# 将数值列转为长格式,过滤空值
melted_df = merged_df.melt(id_vars='#id', value_name='values').dropna(subset=['values'])

# 按ID分组计算中位数并重置索引
result_df = melted_df.groupby('#id')['values'].median().reset_index()

print(result_df)

方法二:重命名后拼接计算

先统一所有数值列的名称,再拼接DataFrame,最后分组计算中位数(更简洁):

# 重命名每个DataFrame的数值列为统一名称
renamed_dfs = [df.rename(columns={df.columns[1]: 'values'}) for df in df_list]

# 拼接所有DataFrame并过滤空值
concatenated_df = pd.concat(renamed_dfs).dropna(subset=['values'])

# 分组计算中位数
result_df = concatenated_df.groupby('#id')['values'].median().reset_index()

print(result_df)

两种方法都能得到与期望一致的结果。

内容的提问来源于stack exchange,提问作者brizzy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 13:45:47