如何为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'])
原代码问题分析
- 列名大小写错误:原DataFrame列名是
Date_updated,但代码中误写为Date_Updated,导致无法正确取值 - 逻辑判断错误:
add_tick函数中判断r['Date_Updated'] == r[i],但r[i]初始是空字符串,永远不会和日期值相等,应该判断当前列名是否等于该行的Date_updated值 - 重复处理问题:循环
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
相关产品推荐
相关产品推荐

