如何按Stock列匹配合并多份含Stock与TF列的DataFrame
解决多DataFrame匹配Stock并合并TF列的问题
你之前用链式inner merge或reduce做inner merge没得到预期结果,是因为inner merge只会保留所有DataFrame中都存在的Stock,而你需要的是至少在两个DataFrame中出现的Stock,并合并它们对应的TF值。下面是具体实现步骤:
步骤1:给每个DataFrame的TF列添加来源标识
先把每个DataFrame的TF列重命名,带上对应DataFrame的名称,避免合并后列名冲突:
import pandas as pd from functools import reduce # 假设你的5个DataFrame是df1到df5,先重命名TF列 df1 = df1.rename(columns={"TF": "TF_df1"}) df2 = df2.rename(columns={"TF": "TF_df2"}) df3 = df3.rename(columns={"TF": "TF_df3"}) df4 = df4.rename(columns={"TF": "TF_df4"}) df5 = df5.rename(columns={"TF": "TF_df5"})
步骤2:Outer Merge合并所有DataFrame
用outer merge把所有DataFrame基于Stock列合并,这样能保留所有出现过的Stock,不存在的TF值会显示为NaN:
# 把所有DataFrame放进列表,用reduce执行outer merge dfs_list = [df1, df2, df3, df4, df5] merged_total = reduce(lambda left, right: pd.merge(left, right, on="Stock", how="outer"), dfs_list)
步骤3:过滤出至少存在两个TF值的Stock
计算每行非空TF列的数量,只保留数量≥2的行,就是你需要的匹配Stock:
# 统计每行非空TF列的数量 merged_total["tf_count"] = merged_total.filter(like="TF_").notna().sum(axis=1) # 过滤并移除统计列 result_df = merged_total[merged_total["tf_count"] >= 2].drop("tf_count", axis=1)
结果说明
最终的result_df中,每个Stock对应的TF列会显示它在对应DataFrame中的值,NaN表示该Stock未在这个DataFrame中出现。比如AKENR会显示TF_df1和TF_df4的值,其他TF列为空,完全符合你的预期需求。
内容的提问来源于stack exchange,提问作者Coin Bey
相关产品推荐
相关产品推荐

