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
假设我有以下两个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