如何合并数据帧而不丢失数据?

2024-04-26 13:49:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我想将两个数据帧组合在一起,并将左数据帧的数据优先于右数据帧:

我目前有:

(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]

但是它丢失了问题结构3029937752的第一行,即使它与df中的任何内容都不冲突,并且复制了3029937753,后者确实冲突。你知道吗


Tags: columns数据dfnanpdbpprowsquestion
1条回答
网友
1楼 · 发布于 2024-04-26 13:49:19

^{}只是匹配索引,而不是值(就像合并一样),并更新这些行中的nan。如果在question_struct中有额外的列,或者在df中有nan,那么这些列将被合并到新的数据帧中,因为您不需要,所以它不会提取任何内容。你知道吗

下面是一个例子来解释发生了什么:

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

相关问题 更多 >