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

如何基于两个Pandas DataFrame构造指定结构的新DataFrame

在Pandas中添加指定行并匹配列填充

问题背景

现有两个DataFrame:

import pandas as pd

df1 = pd.DataFrame({350 : [100, 101, 99], 
                    250 : [100, 1010, 1020], 
                    210 : [1000, 999, 1000], 
                    200 : [300, 320, 100]}, 
                   index = range(1990, 1993))
df2 = pd.DataFrame({'ID' : [250, 250, 210], 
                    'data' : [100, 1020, 800], 
                    })

需要生成新的DataFrame df3,满足:

  • 在df1末尾添加一行,索引为df1最后一个索引+1(即1993)
  • 用df2['data']的值填充对应列(df2['ID']对应df1的列名),处理df1列与df2行不匹配的情况
  • 最终结构如下:
350    250    210
Date 
1990       100.   100.   1000
1991       101.   1010.  999
1992       99.    1020.  1000
1993       100.   1020.  800

(注:原示例中1990行的250值应为100,与df1一致,推测是笔误)

解决方案

步骤1:清理df2,去重并保留每个ID的最后一个值

由于df2中存在重复ID(如250出现两次),需保留每个ID对应的最后一条数据,避免填充冲突:

# 将df2转换为以ID为索引的Series,仅保留每个ID的最后一个data值
df2_clean = df2.groupby('ID')['data'].last()

步骤2:构造新行数据

先确定新行索引,再创建与df1列匹配的Series,用df2_clean的值覆盖对应列;对于df2中未匹配的列,参考示例取该列的第一个值(可根据需求改为NaN、前一行值等):

# 计算新行的索引
new_index = df1.index[-1] + 1

# 初始化新行,默认用各列的第一个值填充
new_row = df1.iloc[0].copy()
# 用df2_clean的值覆盖对应列
new_row.update(df2_clean)

步骤3:添加新行并整理输出

将新行追加到df1,移除不需要的列(如示例中的200列),并设置索引名称:

# 追加新行到df1
df3 = df1.append(new_row.rename(new_index))

# 移除不需要的200列(若不需要可跳过此步骤)
df3 = df3.drop(columns=200)

# 设置索引名称
df3.index.name = 'Date'

# 查看最终结果
print(df3)

最终输出

350   250   210
Date                      
1990      100   100  1000
1991      101  1010   999
1992       99  1020  1000
1993      100  1020   800

关键说明

  • 重复ID处理:通过groupby('ID')['data'].last()确保每个ID只保留最新数据,避免填充冲突
  • 列不匹配处理:update方法仅覆盖df2中存在的列,未匹配列的默认值可灵活调整(如改为df1.iloc[-1].copy()取前一行值,或pd.Series(index=df1.columns)设为NaN)
  • 列过滤:若不需要移除200列,直接跳过drop(columns=200)步骤即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 16:33:31