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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 10:43:14