如何使用Pandas标记DataFrame中匹配另一DataFrame数值的单元格
问题
我有两个Pandas DataFrame:DF1的列标签是特定数字,DF2的ID列里散布着这些列标签数值,两表靠SN列匹配。需要在DF1中对应位置标记"x",表示该列号出现在对应SN的DF2的ID列里。
示例数据:
import pandas as pd import numpy as np # DF1初始状态 DF1 = pd.DataFrame({ 'SN': ['1121', '1122', '1123', '1143', '1156'], '12': ['']*5, '13': ['']*5, '14': ['']*5, '15': ['']*5, '16': ['']*5 }).set_index('SN') # DF2数据 DF2 = pd.DataFrame({ 'SN': ['1121', '1122', '1123', '1143', '1156'], 'ID1': [12, 12, np.nan, np.nan, np.nan], 'ID2': [15, 16, np.nan, np.nan, np.nan], 'ID3': [14, 14, np.nan, np.nan, np.nan], 'ID4': [16, np.nan, np.nan, np.nan, 14], 'ID5': [np.nan, np.nan, np.nan, np.nan, np.nan] }).set_index('SN')
期望得到的结果:
12 13 14 15 16 SN 1121 x x x x 1122 x x x 1123 1143 1156 x
解决方法
方法一:分步处理(易理解)
先把DF2的多列ID转成按SN分组的ID集合,再逐个填充DF1:
# 1. 把DF2的所有ID列转成长格式,保留SN和有效ID值 df2_long = DF2.unstack().reset_index() df2_long.columns = ['ID_col', 'SN', 'ID_value'] df2_valid = df2_long.dropna(subset=['ID_value']) # 2. 按SN分组,把每个SN对应的ID转成字符串集合(匹配DF1的列名) sn_id_map = df2_valid.groupby('SN')['ID_value'].apply(lambda x: set(map(str, x))) # 3. 遍历DF1填充"x" for sn in DF1.index: if sn in sn_id_map: target_ids = sn_id_map[sn] for col in DF1.columns: if col in target_ids: DF1.loc[sn, col] = 'x' print(DF1)
方法二:一行apply搞定(简洁高效)
利用apply对每行数据做判断:
# 先给DF2的每行生成一个去重的ID字符串集合(去掉NaN) df2_id_sets = DF2.apply(lambda row: set(map(str, row.dropna())), axis=1) # 对DF1的每行,检查列名是否在对应SN的ID集合里,是则标"x" DF1 = DF1.apply( lambda row: pd.Series( ['x' if col in df2_id_sets[row.name] else '' for col in DF1.columns], index=DF1.columns ), axis=1 ) DF1.index.name = 'SN' print(DF1)
两种方法都能得到目标结果,方法一适合新手理清逻辑,方法二更适合快速实现。
内容的提问来源于stack exchange,提问作者TheMcFloyd
相关产品推荐
相关产品推荐

