Python:如何仅更新pandas.DataFrame中的NaN值?

2024-04-25 18:50:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个数据帧

>>> import pandas as pd
>>> import numpy as np
>>> df = pd.DataFrame({'A': [1, 2, 3], 'B': [400, np.nan, 600]})
>>> print(df)
   A      B
0  1  400.0
1  2    NaN
2  3  600.0

>>> new_df = pd.DataFrame({'B': [4, 5, 6], 'C': [7, 8, 9]})
>>> print(new_df)
   B  C
0  4  7
1  5  8
2  6  9

如何通过new_df更新df以填充NaN值?我想得到以下信息:

>>> print(df)
   A      B
0  1  400.0
1  2    5.0
2  3  600.0

Tags: 数据importnumpy信息dataframepandasdfnew
3条回答
import numpy as np
df['B']  = np.where(df['B'].isnull(), new_df['B'], df['B'])

一种方法是使用.update

df.update(new_df, overwrite = False)
df.head()
#output:
    A   B
0   1   400.0
1   2   5.0
2   3   600.0

运行时

%%timeit 
df = pd.DataFrame({'A': [1, 2, 3] * 1000, 'B': [400, np.nan, 600] * 1000})
new_df = pd.DataFrame({'B': [4, 5, 6] * 1000, 'C': [7, 8, 9] * 1000})
df.update(new_df, overwrite = False)

4.24 ms ± 48.1 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

%%timeit 
df = pd.DataFrame({'A': [1, 2, 3] * 1000, 'B': [400, np.nan, 600] * 1000})
new_df = pd.DataFrame({'B': [4, 5, 6] * 1000, 'C': [7, 8, 9] * 1000})
df.fillna(new_df)

6.78 ms ± 229 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

%%timeit 
df = pd.DataFrame({'A': [1, 2, 3] * 1000, 'B': [400, np.nan, 600] * 1000})
new_df = pd.DataFrame({'B': [4, 5, 6] * 1000, 'C': [7, 8, 9] * 1000})
df['B']  = np.where(df['B'].isnull(), new_df['B'], df['B'])

3.91 ms ± 153 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

我想你正在寻找这个:

df.fillna(new_df)

相关问题 更多 >