2015-09-30 3 views
2

Предположим, У меня есть следующие два DataFrames:Панды: объединить два dataframes пренебрегая 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 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 на месте.

Как это сделать?

ответ

3

Вы можете продолжить просто с update который заполняет первый dataframe 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 
+0

Работает как очарование! Большое спасибо! –

0

Если переименовать столбцы вашего второго 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 
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] 
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 
Смежные вопросы