我找不到一个pandas函数(我之前见过)用数据框中的NaN替换另一个数据帧的值(假设可以指定一个公共索引)。有什么帮助吗?
答案 0 :(得分:20)
如果你有两个相同形状的DataFrame,那么:
df[df.isnull()] = d2
会做的伎俩。
只有df.isnull()
评估为True
的地点(以绿色突出显示)才有资格获得作业。
实际上,DataFrames的大小/形状并不总是一样,转换方法(尤其是.shift()
)也很有用。
进入的数据总是很脏,不完整或不一致。参加课程。有一个非常广泛的熊猫tutorial and associated cookbook来处理这些情况。
答案 1 :(得分:12)
正如我刚才所了解的那样,有一个DataFrame.combine_first()
方法正是如此,其附加属性是,如果您的更新数据框d2
大于原始df
,还添加了其他行和列。
df = df.combine_first(d2)
答案 2 :(得分:5)
DataFrame.combine_first()完全回答了这个问题。
但是,有时您希望使用DataFrame B中的值填充/替换/覆盖DataFrame A的一些非缺失(非NaN)值。这个问题将我带到此页面,解决方案是{{3 }}
A = B.mask(condition, A)
当condition
为真时,将使用A中的值,否则将使用B的值。
例如,您可以使用mask
解决OP的原始问题,这样当A中的元素是非NaN时,请使用它,否则使用B中的相应元素。
但是使用DataFrame.mask()你可以用B中的值替换不符合任意条件(小于零?超过100?)的A的值。因此mask
更灵活,而且过度杀伤对于这个问题,但我认为值得一提(我需要它来解决我的问题)。
注意B可能是一个numpy数组而不是DataFrame也很重要。 DataFrame.mask()要求B是一个DataFrame,但DataFrame.combine_first()只要求B&是一个NDFrame,其尺寸与A的尺寸相匹配。
答案 3 :(得分:5)
专用的方法是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
请注意,更新后的NaN
值与aaa, A
和eee, B
相交
答案 4 :(得分:3)
这应该像
一样简单df.fillna(d2)