如何在不丢失数据的情况下组合数据帧?

时间:2014-03-02 05:40:35

标签: python numpy pandas

我想将两个数据帧组合在一起,将左侧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也存在冲突。

1 个答案:

答案 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