根据第二个数据框中的 NA 值覆盖 pandas 数据框中的值

Overwriting values in a pandas dataframe based on NA values from a second one

如果我有一个 pandas 数据框 df1 定义为:

df1 = pd.DataFrame({'a': [ 1, 2], 'b': [3, 4]})

和一个相同大小的数据框 df2,相同的列名和索引,但在某处具有 NA 值,两者

方法A:

nan_locations = np.where(df2.isnull())
df1.values[nan_locations] = np.nan

方法B:

df1[df2.isnull()] = np.nan

用来自 df2 中相同位置的 NA 覆盖 df1 中的值。但是,如果我对从 Excel 文件读取的数据帧执行相同操作,则方法 A 并不总是有效。有人可以解释一下为什么会这样吗?

这可能与第一个 DataFrame 的数据类型有关,其值需要被覆盖。当 DataFrame 是混合数据类型时,values 属性 returns 一个带有向上转换数据类型 (doc) 的 ndarray,这似乎是一个副本。因此,对该副本的分配将丢失。

这是一个 "simple" DataFrame 的示例,其中方法 A 和 B 都有效:

df1 = pd.DataFrame({'a': [1.0, 2.0], 'b': [3.0, 4.0]})
df2 = pd.DataFrame({'a': [1.0, 2.0], 'b': [np.nan, 4.0]})

另一方面,这个看似相似的DataFrame只适用于方法B:

df1 = pd.DataFrame({'a': [1, 2], 'b': [3.0, 4.0]})
df2 = pd.DataFrame({'a': [1, 2], 'b': [np.nan, 4.0]})

因为 df1 的数据类型是:

a      int64
b    float64

因此,您的 Excel 文件中的数据可能会导致具有混合数据类型的 DataFrame。使用适当的索引器来更新内容应该优于直接操作低级别值表示。