Pandas从另一个数据帧填充数据框中的缺失值

use*_*827 12 python pandas

我找不到一个pandas函数(我以前见过)用数据框中的NaN替换另一个数据帧的值(假设可以指定一个公共索引).有帮助吗?

Jon*_*ice 24

如果您有两个相同形状的DataFrame,那么:

df[df.isnull()] = d2
Run Code Online (Sandbox Code Playgroud)

会做的伎俩.

视觉表现

只有df.isnull()评估的位置True(以绿色突出显示)才有资格进行分配.

实际上,DataFrames的大小/形状并不总是相同,转换方法(特别是.shift())也很有用.

进入的数据总是很脏,不完整或不一致.参加课程.有一个非常广泛的熊猫教程和相关的食谱来处理这些情况.


piR*_*red 15

这应该很简单

df.fillna(d2)
Run Code Online (Sandbox Code Playgroud)

  • 2021 年问题的最干净的解决方案应该是公认的答案。请注意,两个数据框中的列名称必须相同。 (2认同)

Ana*_*ory 13

正如我刚才所了解的那样,有一种DataFrame.combine_first()方法正是如此,其附加属性是,如果更新数据框d2大于原始数据框df,则还会添加其他行和列.

df = df.combine_first(d2)
Run Code Online (Sandbox Code Playgroud)


Erf*_*fan 10

一个专门的方法是DataFrame.update

引用自文档:

使用来自另一个 DataFrame 的非 NA 值就地修改。
在索引上对齐。没有返回值。

需要注意的是,此方法将就地修改您的数据。所以它会覆盖你更新的数据框。

示例

print(df1)
       A    B     C
aaa  NaN  1.0   NaN
bbb  NaN  NaN  10.0
ccc  3.0  NaN   6.0
ddd  NaN  NaN   NaN
eee  NaN  NaN   NaN

print(df2)
         A    B     C
index                
aaa    1.0  1.0   NaN
bbb    NaN  NaN  10.0
eee    NaN  1.0   NaN

# update df1 NaN where there are values in df2
df1.update(df2)
print(df1)
       A    B     C
aaa  1.0  1.0   NaN
bbb  NaN  NaN  10.0
ccc  3.0  NaN   6.0
ddd  NaN  NaN   NaN
eee  NaN  1.0   NaN
Run Code Online (Sandbox Code Playgroud)

注意NaN相交处的更新值aaa, Aeee, B


Joh*_*ior 5

DataFrame.combine_first()完全回答了这个问题.

但是,有时您希望使用DataFrame B中的值填充/替换/覆盖DataFrame A的一些非缺失(非NaN)值.该问题将我带到此页面,解决方案是DataFrame.mask()

A = B.mask(condition, A)
Run Code Online (Sandbox Code Playgroud)

如果condition为true,将使用A中的值,否则将使用B的值.

例如,你可以解决OP的原始问题mask,当A中的元素是非NaN时,使用它,否则使用来自B的相应元素.

但是使用DataFrame.mask()你可以用B中的值替换不符合任意条件(小于零?超过100?)的A的值.所以mask更灵活,并且对这个问题有点过分,但我认为它值得一提(我需要它来解决我的问题).

同样重要的是要注意B可能是一个numpy数组而不是DataFrame.DataFrame.combine_first()要求B是一个DataFrame,但DataFrame.mask()只要求B是一个NDFrame,其尺寸与A的尺寸相匹配.