简体   繁体   English

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

[英]Python: How to update only NaN values in pandas.DataFrame?

I have got two data frames.我有两个数据框。

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

and

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

How can I update df by new_df to fill NaN values?如何通过new_df更新df以填充 NaN 值? I would like to get following:我想得到以下信息:

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

I think you are looking for this:我想你正在寻找这个:

df.fillna(new_df)
import numpy as np
df['B']  = np.where(df['B'].isnull(), new_df['B'], df['B'])

One way of doing this is using .update一种方法是使用.update

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

Runtime运行

%%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)每个循环 4.24 毫秒 ± 48.1 微秒(平均值 ± 标准偏差。7 次运行,每次 100 次循环)

%%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)每个循环 6.78 毫秒 ± 229 微秒(平均值 ± 标准偏差。7 次运行,每次 100 次循环)

%%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)每个循环 3.91 毫秒 ± 153 微秒(平均值 ± 标准偏差。7 次运行,每次 100 次循环)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM