Python 熊猫从另一个数据帧填充数据帧中缺少的值

Python 熊猫从另一个数据帧填充数据帧中缺少的值,python,pandas,Python,Pandas,我找不到pandas函数(我以前见过)来用另一个数据帧中的值替换数据帧中的NaN(假设可以指定公共索引)。有什么帮助吗?如果您有两个形状相同的数据帧,那么: df[df.isnull()] = d2 我会成功的 只有df.isnull()计算结果为True(以绿色突出显示)的位置才有资格分配 实际上,数据帧的大小/形状并不总是相同的,转换方法(尤其是.shift())非常有用 输入的数据总是脏的、不完整的或不一致的。当然是标准杆。处理这些情况有相当广泛的方法。正如我刚刚了解到的,有一种方法可

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

如果您有两个形状相同的数据帧,那么:

df[df.isnull()] = d2
我会成功的

只有
df.isnull()
计算结果为
True
(以绿色突出显示)的位置才有资格分配

实际上,数据帧的大小/形状并不总是相同的,转换方法(尤其是
.shift()
)非常有用


输入的数据总是脏的、不完整的或不一致的。当然是标准杆。处理这些情况有相当广泛的方法。

正如我刚刚了解到的,有一种方法可以做到这一点,它的附加属性是,如果更新的数据帧
d2
大于原始的
df
,则还会添加额外的行和列

df = df.combine_first(d2)
准确地回答了这个问题

但是,有时您希望用数据帧B中的值填充/替换/覆盖数据帧A的一些非缺失(非NaN)值。这个问题将我带到了本页,解决方案是

条件
为真时,将使用A的值,否则将使用B的值

例如,您可以使用
mask
解决OP的原始问题,这样当A中的元素为非NaN时,可以使用它,否则可以使用B中相应的元素

但是使用你可以用B中的值替换不符合任意标准(小于零?大于100?)的A的值。因此
mask
更灵活,对这个问题来说是多余的,但我认为它值得一提(我需要它来解决我的问题)


还需要注意的是,B可以是numpy数组,而不是数据帧。要求B是数据帧,但只要求B是NDFrame且其维度与a的维度匹配。

这应该简单到

df.fillna(d2)

这方面的专用方法是:

引自文件:

使用其他数据帧中的非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

注意,intersect
aaa,A
eee,B

上更新的
NaN
值听起来像是要合并。请展示一些示例场景。找到了!我想先使用combine_
fillna
有一个
value
参数,可用于通过公共索引映射缺少的值,但这要求参数类型为
Series
dict
,而不是
DataFrame
。注意,您可能需要执行以下操作:df[df.isnull()]=d2.valuesBeautiful,simple,优雅!2021年最干净的解决方案应该是公认的答案。请注意,两个数据帧中的列名必须相同。
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