Python 熊猫:合并两个数据帧

Python 熊猫:合并两个数据帧,python,pandas,merging-data,Python,Pandas,Merging Data,假设我有以下两个数据帧: X Y Z 1 0.0 0.0 0.0 2 1.0 2.0 3.0 3 4.0 2.0 0.0 4 NaN NaN NaN 5 NaN NaN NaN 6 NaN NaN NaN 7 NaN NaN NaN 8 NaN NaN NaN 及 我想用第二个数据框中的值来填充第一个数据框中缺少的数据。结果应该如下所示: X Y Z 1 0.0 0.0 0.0 2 1.0 2.0 3.0 3 4.0 2

假设我有以下两个
数据帧

  X    Y    Z
1 0.0  0.0  0.0
2 1.0  2.0  3.0
3 4.0  2.0  0.0
4 NaN  NaN  NaN
5 NaN  NaN  NaN
6 NaN  NaN  NaN
7 NaN  NaN  NaN
8 NaN  NaN  NaN

我想用第二个
数据框中的值来填充第一个
数据框中缺少的数据。结果应该如下所示:

  X    Y    Z
1 0.0  0.0  0.0
2 1.0  2.0  3.0
3 4.0  2.0  0.0
4 NaN  NaN  NaN
5 NaN  NaN  NaN
6 9.0  3.0  6.0
7 7.0  4.0  3.0
8 3.0  6.0  8.0
如果可能,我希望避免创建新的
数据框
,而是将第一个
数据框
填充到位


如何执行此操作?

如果重命名第二个数据帧的列,则可以使用concat和groupby,如下所示:

In[96]: df1
Out[96]: 
    X   Y   Z
1   0   0   0
2   1   2   3
3   4   2   0
4 NaN NaN NaN
5 NaN NaN NaN
6 NaN NaN NaN
7 NaN NaN NaN
8 NaN NaN NaN

In[101]: df2
Out[101]: 
    X   Y   Z
1 NaN NaN NaN
2 NaN NaN NaN
3 NaN NaN NaN
4 NaN NaN NaN
5 NaN NaN NaN
6   9   3   6
7   7   4   3
8   3   6   8

In[102]: pd.concat([df1,df2]).groupby(level=0).sum()
Out[102]: 
    X   Y   Z
1   0   0   0
2   1   2   3
3   4   2   0
4 NaN NaN NaN
5 NaN NaN NaN
6   9   3   6
7   7   4   3
8   3   6   8

您只需继续执行
update
,它根据
df2
的值填充第一个数据帧
df1

df2.columns = df1.columns

df1.update(df2)

In [118]: df1
Out[118]:
    X   Y   Z
1   0   0   0
2   1   2   3
3   4   2   0
4 NaN NaN NaN
5 NaN NaN NaN
6   9   3   6
7   7   4   3
8   3   6   8

如果将列对齐,则fillna()将执行以下操作:

df2.columns = df1.column
df1.fillna(df2, inplace=True)
df1

    X   Y   Z
1   0   0   0
2   1   2   3
3   4   2   0
4 NaN NaN NaN
5 NaN NaN NaN
6   9   3   6
7   7   4   3
8   3   6   8

工作起来很有魅力!谢谢!
df2.columns = df1.columns

df1.update(df2)

In [118]: df1
Out[118]:
    X   Y   Z
1   0   0   0
2   1   2   3
3   4   2   0
4 NaN NaN NaN
5 NaN NaN NaN
6   9   3   6
7   7   4   3
8   3   6   8
df2.columns = df1.column
df1.fillna(df2, inplace=True)
df1

    X   Y   Z
1   0   0   0
2   1   2   3
3   4   2   0
4 NaN NaN NaN
5 NaN NaN NaN
6   9   3   6
7   7   4   3
8   3   6   8