Pandas:合并两个数据框,忽略NaN

7
假设我有以下两个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中填充数据。 如何做到这一点?
4个回答

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

非常好用!非常感谢! - Hendrik Wiese

1
如果您将列对齐,那么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

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接