如何基于多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
相关产品推荐
相关产品推荐

