如何基于两个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
相关产品推荐
相关产品推荐

