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

