如何用Pandas将人员姓名匹配到以日期为索引的DataFrame?
问题描述
我有一个存储不同人员生日信息的Excel文件,对应的Pandas DataFrame以人员姓名为索引,结构如下:
import pandas as pd pd.DataFrame({'Date': ['2022-05-01', '2022-05-02', '2022-05-03']}, index=['Mark', 'Tom', 'Lara'])
我希望将人员姓名匹配到以日期为索引的目标Pandas DataFrame中,目标结构如下:
Time Address Birthday 2022-05-01 345yy 2022-05-02 123xx 2022-05-03 456ll
已知无重复生日,需要一个遍历并写入DataFrame对应日期位置的简单示例,要处理Pandas Series。我尝试的代码如下:
df = pd.read_excel("Birthdays.xlsx") for row in df.itertuples(): if pd.to_datetime(row[0]) in Birthdays: df["Birthday",row] = name
解决方案
你的尝试代码存在遍历逻辑错误、索引匹配不当、赋值语法错误等问题,下面给出两种可行实现方式:
方式1:矢量化匹配(推荐)
Pandas优先推荐矢量化操作,无需手动遍历,效率更高:
import pandas as pd # 1. 读取并处理生日数据:转换日期格式,构建日期→姓名的映射Series birth_df = pd.read_excel("Birthdays.xlsx", index_col=0) birth_df['Date'] = pd.to_datetime(birth_df['Date']) date_to_name = birth_df.reset_index().set_index('Date')['index'] # 2. 读取/构建目标DataFrame(确保索引为datetime类型) target_df = pd.DataFrame( {'Address': ['345yy', '123xx', '456ll']}, index=pd.to_datetime(['2022-05-01', '2022-05-02', '2022-05-03']) ) target_df.index.name = 'Time' # 3. 批量匹配赋值 target_df['Birthday'] = target_df.index.map(date_to_name)
方式2:遍历实现(满足遍历需求)
如果必须用遍历方式,修正后的代码如下:
import pandas as pd # 1. 读取生日数据,构建日期→姓名的字典 birth_df = pd.read_excel("Birthdays.xlsx", index_col=0) birth_df['Date'] = pd.to_datetime(birth_df['Date']) date_name_dict = birth_df.set_index('Date')['index'].to_dict() # 2. 读取/构建目标DataFrame target_df = pd.DataFrame( {'Address': ['345yy', '123xx', '456ll']}, index=pd.to_datetime(['2022-05-01', '2022-05-02', '2022-05-03']) ) target_df.index.name = 'Time' target_df['Birthday'] = None # 初始化Birthday列 # 3. 遍历目标DataFrame并赋值 for date_idx, _ in target_df.iterrows(): if date_idx in date_name_dict: target_df.loc[date_idx, 'Birthday'] = date_name_dict[date_idx]
关键说明
- 必须保证生日数据和目标DataFrame的日期均为
datetime类型,才能精准匹配 - 用映射关系(Series或字典)替代逐行查找,能大幅提升效率
- 赋值时使用
loc进行精准定位,避免链式赋值引发的警告或错误
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

