如何用Pythonic方式计算两个DataFrame共列的行均值?
Pythonic实现两个DataFrame匹配Key行的共同列逐行均值
这问题我熟!完全不用写繁琐的循环,用pandas的向量化操作就能轻松搞定,既简洁又高效。咱们直接上代码和思路:
第一步:构造示例数据
先把你给出的两个DataFrame用代码还原出来:
import pandas as pd # 构造DF1 df1 = pd.DataFrame({ 'Key': ['K1', 'K2', 'K3', 'K4'], 'A': [2, 2, 2, 2], 'B': [3, 3, 3, 3], 'C': [4, 4, 4, 4], 'D': [5, 5, 5, 5], 'E': [8, 8, 8, 8] }) # 构造DF2 df2 = pd.DataFrame({ 'Key': ['K1', 'K2', 'K3', 'K4'], 'A': [4, 4, 4, 4], 'B': [7, 7, 7, 7], 'C': [4, 4, 4, 4], 'D': [7, 7, 7, 7] })
方法一:索引对齐法(最简洁)
这种方法利用pandas的索引对齐特性,一步到位计算均值:
# 将Key设置为索引,方便按Key自动对齐 df1_idx = df1.set_index('Key') df2_idx = df2.set_index('Key') # 找出两个DataFrame的共同列(排除Key后的交集) common_columns = df1_idx.columns.intersection(df2_idx.columns) # 直接对共同列做向量化运算,计算逐行均值 result_df = (df1_idx[common_columns] + df2_idx[common_columns]) / 2 # 重置索引,把Key变回普通列 result_df = result_df.reset_index() print(result_df)
运行后输出的结果就是你想要的:
Key A B C D 0 K1 3 5 4 6 1 K2 3 5 4 6 2 K3 3 5 4 6 3 K4 3 5 4 6
进阶处理:Key不匹配/顺序不一致的情况
如果两个DataFrame的Key存在缺失或者顺序不同,可以用align方法确保只保留双方都有的Key:
# 对齐两个DataFrame的索引和列,只保留共同的Key和列 df1_aligned, df2_aligned = df1_idx[common_columns].align(df2_idx[common_columns], join='inner') # 计算均值 result_df = (df1_aligned + df2_aligned) / 2 result_df = result_df.reset_index()
方法二:Merge合并法(适合复杂场景)
如果需要处理更复杂的匹配逻辑(比如多键匹配),可以用merge先合并两个DataFrame,再计算均值:
# 按Key合并两个DataFrame,用后缀区分来自不同DF的列 merged_df = pd.merge(df1, df2, on='Key', suffixes=('_df1', '_df2')) # 遍历共同列,计算每列的均值 common_columns = df1.columns.drop('Key').intersection(df2.columns.drop('Key')) for col in common_columns: merged_df[col] = (merged_df[f"{col}_df1"] + merged_df[f"{col}_df2"]) / 2 # 只保留需要的列:Key + 计算后的共同列 result_df = merged_df[['Key'] + list(common_columns)] print(result_df)
为什么这是Pythonic的?
这两种方法都避免了手动遍历行,完全利用pandas的向量化操作——这种方式不仅代码更简洁,运行效率也比循环高得多,尤其是处理大数据量的时候优势明显。
内容的提问来源于stack exchange,提问作者Rehan Azher
相关产品推荐
相关产品推荐

