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

如何拼接两个DataFrame的指定行,生成无NaN的单行DataFrame?

合并不同DataFrame指定行生成单行DataFrame

问题重现

现有两个行数相同、列不同的DataFrame df1 和 df2,创建代码如下:

import pandas as pd
import numpy as np

n=10

df = pd.DataFrame(
    {
        "A": 1.0,
        "B": pd.Timestamp("20130102"),
        "C": pd.Series(1, index=list(range(n)), dtype="float32"),
        "D": np.array([3] * n, dtype="int32"),
        "E": pd.Categorical(["test", "train"] * int(n/2)),
        "F": "foo",
    }
)

i_f = ['A', 'B']
o_f = ['C', 'D', 'E', 'F']
df1 = pd.DataFrame(data=df[i_f].values, columns=i_f).reset_index(drop=True)
df2 = pd.DataFrame(data=df[o_f].values, columns=o_f).reset_index(drop=True)

需要选取df1的第i行和df2的第j行,合并成包含所有列的单行DataFrame。但执行以下代码时:

i = 3
j = 2 
df_curr = pd.concat([df1.iloc[[i], :], df2.iloc[[j], :]], axis=1)

得到的是带NaN的两行结果:

A          B    C    D     E    F
3  1.0 2013-01-02  NaN  NaN   NaN  NaN
2  NaN        NaT  1.0    3  test  foo

期望输出为:

A          B    C    D     E    F
    1.0 2013-01-02  1.0    3  test  foo

原因分析

df1.iloc[[i], :]和df2.iloc[[j], :]会保留原DataFrame的索引(分别为3和2),使用pd.concat(axis=1)合并时,Pandas会按索引对齐,索引不匹配的位置就会填充NaN,最终生成两行数据。

解决方案

方法1:重置子DataFrame的索引后合并

在选取行后,通过reset_index(drop=True)将索引统一为0,再执行合并:

i = 3
j = 2
df_curr = pd.concat(
    [df1.iloc[[i], :].reset_index(drop=True), 
     df2.iloc[[j], :].reset_index(drop=True)], 
    axis=1
)

方法2:合并行字典构造新DataFrame

将两行数据转为字典后合并,直接构造单行DataFrame:

i = 3
j = 2
row_data = {**df1.iloc[i].to_dict(), **df2.iloc[j].to_dict()}
df_curr = pd.DataFrame([row_data])

方法3:手动统一索引后合并

将两个选取的行的索引都设置为同一个值(比如0),再执行合并:

i = 3
j = 2
df_curr = pd.concat(
    [df1.iloc[[i], :].set_index(pd.Index([0])), 
     df2.iloc[[j], :].set_index(pd.Index([0]))], 
    axis=1
)

以上三种方法都能得到期望的单行合并结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 13:55:18