Pandas:合并两个忽略 NaN 的数据帧

Pandas: merge two dataframes ignoring NaN

假设我有以下两个DataFrames:

  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.2  Y.2  Z.2
1 NaN  NaN  NaN
2 NaN  NaN  NaN
3 NaN  NaN  NaN
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

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

  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

如果可能的话,我想避免创建一个新的 DataFrame,而是将第一个 DataFrame 填充到位。

我该怎么做?

如果重命名第二个数据框的列,则可以像这样使用 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
with python if dataframe could be list of lists

d1 =[[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']]


d2 = [[1,'NaN', 'NaN', 'NaN'],
    [2,'NaN', 'NaN', 'NaN'],
    [3,'NaN', 'NaN', 'NaN'],
    [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]]


def replace_row(l,ln):

    for i, el in enumerate(l):
        if el  == 'NaN':
            l[i] = ln[i]


for i,l1 in enumerate(d1):
    for j, l2 in enumerate(d2):
        if i == j:
            replace_row(l1,l2)


for el in d1:
    print(el)

result in:

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

您可以简单地使用 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