我想将两个数据帧组合在一起,将左侧DataFrame的数据保留在右侧:
我目前有:
(Pdb) pp question_struct
QuestionID RowID MenuID ColumnID SourceRowID SourceColumnID SourceVariationID
0 316926394 3029937752 0 0 3029937752 0 0
1 316926394 3029937753 0 0 3029937753 0 0
2 316926394 3029937754 0 0 3029937754 0 0
3 316926394 3029937755 0 0 3029937755 0 0
4 316926394 3029937756 0 0 3029937756 0 0
5 316926394 3029937757 0 0 3029937757 0 0
[6 rows x 7 columns]
(Pdb) pp df
QuestionID RowID ColumnID MenuID SourceRowID SourceColumnID SourceVariationID ResponseCount
0 316926394 3029937753 0 0 3029937753 0 0 1
[1 rows x 8 columns]
(Pdb) df.combine_first(question_struct)
ColumnID MenuID QuestionID ResponseCount RowID SourceColumnID SourceRowID SourceVariationID
0 0 0 316926394 1 3029937753 0 3029937753 0
1 0 0 316926394 NaN 3029937753 0 3029937753 0
2 0 0 316926394 NaN 3029937754 0 3029937754 0
3 0 0 316926394 NaN 3029937755 0 3029937755 0
4 0 0 316926394 NaN 3029937756 0 3029937756 0
5 0 0 316926394 NaN 3029937757 0 3029937757 0
[6 rows x 8 columns]
但是它丢失了第一行的question_struct 3029937752,即使它与df中的任何内容都没有冲突,并且重复3029937753也存在冲突。
答案 0 :(得分:2)
combine_first
只是匹配索引,而不是值(如合并),以及更新这些行中的NaN。如果question_struct
中有其他列或df
中有NaN,那么这些列将合并到新的DataFrame中,因为它不会提取任何内容。
以下是一个解释正在发生的事情的例子:
In [11]: df1 = pd.DataFrame([[1, 2], [3, 4]], columns=['A', 'B'])
In [12]: df2 = pd.DataFrame([[5, 6], [7, 8]], index=[1, 2], columns=['A', 'C'])
In [13]: df1.combine_first(df2)
Out[13]:
A B C
0 1 2 NaN
1 3 4 6
2 7 NaN 8
看到5未包含在内,因为df1
已经有第1行B列的值。
如果我们先将3作为NaN,那么它将使用5:
In [14]: df1.iloc[1,0] = np.nan # was a 3
In [15]: df1.combine_first(df2)
Out[15]:
A B C
0 1 2 NaN
1 5 4 6
2 7 NaN 8