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

如何基于多DataFrame与列表的匹配计数结果填充目标DataFrame

Python实现统计匹配次数生成目标DataFrame

核心逻辑用统一遍历即可实现,无需重复写18次判断:

  • 先把你现有的6个P类DataFrame存到一个字典里,key对应行索引名(P1/P2/.../P6)
  • 再把3个匹配列表存到另一个字典里,key对应列名(List 1/List 2/List 3)

对任意一个P类DataFrame和匹配列表,用p_df.stack().dropna().isin(目标列表).sum()就能得到匹配次数:stack会把整个DF的所有值摊平成一维序列,dropna去掉空值,isin判断每个值是否在列表里,求和就是总匹配数。

完整代码示例

import pandas as pd
import numpy as np

# ---------------------- 第一步:准备你的数据 ----------------------
# 1. 把P1-P6存入字典,这里只写P1P2做示例,你把剩下的P3-P6补进去就行
p_dfs = {
    "P1": pd.DataFrame({
        "Diagnosis": ["A12", "B15", "C28", np.nan, np.nan, np.nan, np.nan],
        "Meds": [np.nan, np.nan, np.nan, "D22", "E91", np.nan, np.nan],
        "Tests": [np.nan, np.nan, np.nan, np.nan, np.nan, "F14", np.nan],
        "Obs": [np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, "M55"]
    }),
    "P2": pd.DataFrame({
        "Diagnosis": ["K11", "L01", "C28", np.nan, np.nan, np.nan, np.nan],
        "Meds": [np.nan, np.nan, np.nan, "X94", "E91", np.nan, np.nan],
        "Tests": [np.nan, np.nan, np.nan, np.nan, np.nan, "F14", "Y02"],
        "Obs": [np.nan] * 7
    })
    # 补充P3、P4、P5、P6到这里
}

# 2. 把List1-List3存入字典,你把List3的内容补进去就行
match_lists = {
    "List 1": ["A12", "L01", "D22", "K88", "F14", "M55", "N67"],
    "List 2": ["A12", "F14", "N64", "P01", "Y02", "M55"],
    "List 3": [] # 填入你实际的List3内容
}

# ---------------------- 第二步:生成answer_df ----------------------
# 先初始化空的结果表
answer_df = pd.DataFrame(index=p_dfs.keys(), columns=match_lists.keys())

# 遍历填充每个单元格
for p_name, p_df in p_dfs.items():
    # 把当前P表的所有非空值提取出来
    all_values = p_df.stack().dropna()
    for list_name, match_list in match_lists.items():
        # 统计匹配次数
        answer_df.loc[p_name, list_name] = all_values.isin(match_list).sum()

# 输出结果
print(answer_df)

简洁写法(可选)

如果偏好更短的代码,也可以用嵌套推导式直接生成结果:

answer_df = pd.DataFrame(
    [[p_df.stack().dropna().isin(lst).sum() for lst in match_lists.values()] for p_df in p_dfs.values()],
    index=p_dfs.keys(),
    columns=match_lists.keys()
)

运行后得到的结果和你给出的示例完全一致:P1对应List1为4、List2为3,P2对应List1为2、List2为1,符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 12:06:04