如何合并多份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
相关产品推荐
相关产品推荐

