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

如何为Pandas DataFrame多列添加匹配标记函数?

Pandas按日期匹配标记'x'

原始DataFrame

import pandas as pd

lst_1 = ['November-2022', 'October-2022', 'September-2022', 'November-2022']
lst_2 = ['', '', '', '']
lst_3 = ['', '', '', '']
lst_4 = ['', '', '', '']

df1 = pd.DataFrame(list(zip(lst_1 , lst_2, lst_3, lst_4)),
              columns =['Date_updated', 'November-2022', 'October-2022', 'September-2022'])

目标DataFrame

lst_1 = ['November-2022', 'October-2022', 'September-2022', 'November-2022']
lst_2 = ['x', '', '', 'x']
lst_3 = ['', 'x', '', '']
lst_4 = ['', '', 'x', '']

df2 = pd.DataFrame(list(zip(lst_1 , lst_2, lst_3, lst_4)),
              columns =['Date_updated', 'November-2022', 'October-2022', 'September-2022'])

原代码问题分析

  1. 列名大小写错误:原DataFrame列名是Date_updated,但代码中误写为Date_Updated,导致无法正确取值
  2. 逻辑判断错误:add_tick函数中判断r['Date_Updated'] == r[i],但r[i]初始是空字符串,永远不会和日期值相等,应该判断当前列名是否等于该行的Date_updated值
  3. 重复处理问题:循环lst_date时包含重复日期,会对同一列重复赋值,覆盖之前的结果

可行解决方法

方法1:修正apply函数逻辑

# 获取需要处理的日期列(排除Date_updated)
date_cols = [col for col in df1.columns if col != 'Date_updated']

def mark_x(row):
    # 遍历所有日期列,匹配则标记'x',否则留空
    for col in date_cols:
        if row['Date_updated'] == col:
            row[col] = 'x'
    return row

df2 = df1.apply(mark_x, axis=1)

方法2:向量化操作(更高效)

对于大数据量,逐行apply效率较低,推荐用向量化方法:

# 遍历每个日期列,判断该行Date_updated是否等于列名,是则赋值'x',否则为空字符串
for col in df1.columns[1:]:
    df1[col] = df1['Date_updated'].apply(lambda x: 'x' if x == col else '')

df2 = df1.copy()

方法3:使用pd.get_dummies简化

# 生成虚拟变量矩阵,替换1为'x'、0为空字符串
dummy_df = pd.get_dummies(df1['Date_updated'])
# 对齐原DataFrame的日期列顺序
dummy_df = dummy_df[df1.columns[1:]]
# 合并回原日期列
df2 = pd.concat([df1['Date_updated'], dummy_df.replace({1: 'x', 0: ''})], axis=1)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 21:25:23