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

时间:2015-09-30 14:11:13

标签: python pandas merging-data

假设我有以下两个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中的缺失数据。结果应如下所示:

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

答案 0 :(得分:5)

您可以使用update继续,根据df1的值填充第一个数据框df2

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

答案 1 :(得分: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

答案 2 :(得分: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]

答案 3 :(得分:0)

如果你将列排成一行,那么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