连接具有重叠索引但从不重叠值的 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
。我如何连接这些,以便我可以实现具有所有值且没有 NaN
s 的 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的主要内容,如果未能解决你的问题,请参考以下文章