连接具有重叠索引但从不重叠值的 Pandas DataFrame

Posted

技术标签:

【中文标题】连接具有重叠索引但从不重叠值的 Pandas DataFrame【英文标题】:Concatenating Pandas DataFrames with overlapping indexes but never overlapping values 【发布时间】:2019-06-04 00:07:29 【问题描述】:

我有两个任意形状的 DataFrame:

   A     B    C
0  A0   B0   C0
1  A1   B1   C1
2  A2   B2  NaN
3  A3  NaN  NaN
4  A4  NaN  NaN

     A    B   C
2  NaN  NaN  C2
3  NaN   B3  C3
4  NaN   B4  C4
5   A5   B5  C5
6   A6   B6  C6

两个 DataFrame 有重叠的索引。如果有重叠,对于给定的列,一个 DataFrame 中有一个非NaN,另一个 DataFrame 中有一个NaN。我如何连接这些,以便我可以实现具有所有值且没有 NaNs 的 DataFrame:

    A    B    C
0  A0   B0   C0
1  A1   B1   C1
2  A2   B2   C2
3  A3   B3   C3
4  A4   B4   C4
5  A5   B5   C5
6  A6   B6   C6

我提出的解决方案是:

df3 = pd.concat([pd.concat([df1[col].dropna(), df2[col].dropna()]) for col in df1.columns], axis=1)

但是,理想情况下,我不会逐列工作。

【问题讨论】:

【参考方案1】:

使用combine_first:

df = df1.combine_first(df2)

print(df)
    A   B   C
0  A0  B0  C0
1  A1  B1  C1
2  A2  B2  C2
3  A3  B3  C3
4  A4  B4  C4
5  A5  B5  C5
6  A6  B6  C6

【讨论】:

这应该是被接受的答案,因为 combine_first 是为这个特定目的而设计的。【参考方案2】:

df.fillna()df.append()dropna() 一起使用

df1.fillna(df2).append(df2).dropna()

    A   B   C
0   A0  B0  C0
1   A1  B1  C1
2   A2  B2  C2
3   A3  B3  C3
4   A4  B4  C4
5   A5  B5  C5
6   A6  B6  C6

【讨论】:

以上是关于连接具有重叠索引但从不重叠值的 Pandas DataFrame的主要内容,如果未能解决你的问题,请参考以下文章

根据重叠目标将多个索引折叠成组

将具有重叠列名的 Pandas 加入多个数据框?

Pandas - 块之间有重叠的块 read_csv

附加具有多列索引和重叠列名的 DataFrame

基于索引的非重叠滑动窗口

合并具有非唯一索引的多个熊猫数据集