Pandas合并两个DataFrame并转置第二表date列取test字段最新值方案
表2
df2 = pd.DataFrame({'df1_id':['1','2','1','1'],'date':['01-05-2021','03-05-2021','05-05-2021','03-05-2021'],'data':[12,13,16,9],'test':['g','h','j','i'],'test2':['k','l','m','n']})

结果表

结果表生成规则
- 现有两个DataFrame,需要基于
df1_id字段合并,第二张表的date列需转置为结果表的列。 - 结果表的日期列范围为第二张表date列的最小值到最大值的全区间。
- 结果表中各日期列的取值来自第二张表对应的data字段值。
- 结果表中第二张表的test字段仅取每个df1_id对应的最新日期下的取值。
实现方案
全部使用pandas向量化操作,无逐行遍历,实现代码如下:
import pandas as pd # 1. 预处理df2,转换日期格式并按日期升序排序 df2['date'] = pd.to_datetime(df2['date'], format='%d-%m-%Y') df2 = df2.sort_values('date', ignore_index=True) # 2. 生成日期转置宽表 # 同id同日期的data取最新值,补全完整日期区间 pivot_df = df2.pivot_table( index='df1_id', columns='date', values='data', aggfunc='last' ) full_date_range = pd.date_range(start=df2['date'].min(), end=df2['date'].max(), freq='D') pivot_df = pivot_df.reindex(columns=full_date_range) # 日期列名还原为字符串格式 pivot_df.columns = pivot_df.columns.strftime('%d-%m-%Y') pivot_df = pivot_df.reset_index() # 3. 提取每个df1_id最新日期对应的test值 latest_test_df = df2.groupby('df1_id', as_index=False)['test'].last() # 4. 合并所有数据得到最终结果 final_result = df1.merge(pivot_df, on='df1_id', how='left')\ .merge(latest_test_df, on='df1_id', how='left')
如果需要将缺失值填充为指定值(比如0),可以在reindex步骤添加fill_value=0参数即可。
内容的提问来源于stack exchange,提问作者dracarys
相关产品推荐
相关产品推荐

