熊猫从另一个数据框中填充数据框中的缺失值

2025-02-20 09:25:00
admin
原创
58
摘要:问题描述:我找不到 pandas 函数(我之前见过)来用另一个数据框中的值替换数据框中的 NaN(假设可以指定一个公共索引)。有什么帮助吗?解决方案 1:如果您有两个相同形状的 DataFrames,那么:df[df.isnull()] = d2 会起作用。df.isnull()只有评估为(以绿色突出显示)的...

问题描述:

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


解决方案 1:

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

df[df.isnull()] = d2

会起作用。

视觉表现

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

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

传入的数据总是脏的、不完整的或不一致的。这是理所当然的。有一个相当详尽的 pandas教程和相关手册来处理这些情况。

解决方案 2:

正如我刚刚了解到的,有一种DataFrame.combine_first()方法可以精确地做到这一点,并且具有附加属性,即如果更新的数据框d2大于原始数据框df,那么也会添加额外的行和列。

df = df.combine_first(d2)

解决方案 3:

这应该很简单

df.fillna(d2)

解决方案 4:

为此,有一个专门的方法是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, Aeee, B

解决方案 5:

DataFrame.combine_first()准确地回答了这个问题。

但是,有时你想用 DataFrame B 中的值填充/替换/覆盖 DataFrame A 中的一些非缺失(非 NaN)值。这个问题将我带到了这个页面,解决方案是DataFrame.mask()

A = B.mask(condition, A)

condition为真时,将使用来自 A 的值,否则将使用 B 的值。

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

但是使用DataFrame.mask(),您可以用 B 中的值替换不满足任意条件(小于零?大于 100?)的 A 值。因此,mask它更加灵活,并且对于这个问题来说有点小题大做,但我认为值得一提(我需要它来解决我的问题)。

还需要注意的是,B 可以是 numpy 数组,而不是 DataFrame。DataFrame.combine_first ()要求 B 是 DataFrame,但DataFrame.mask()只要求 B 是 NDFrame 并且其尺寸与 A 的尺寸相匹配。

解决方案 6:

其他答案缺少的一个重要信息是combine_firstfillna在索引上匹配,因此您必须使 DataFrames 中的索引匹配才能使这些方法起作用。

很多时候,需要匹配其他一些列来填充缺失值。在这种情况下,您需要set_index首先使用索引来制作要匹配的列。

df1 = df1.set_index(cols_to_be_matched).fillna(df2.set_index(cols_to_be_matched)).reset_index()

或者

df1 = df1.set_index(cols_to_be_matched).combine_first(df2.set_index(cols_to_be_matched)).reset_index()

另一个选择是使用merge

df1 = (df1.merge(df2, on=cols_to_be_matched, how='left', suffixes=('','x00'))
       .sort_index(axis=1).bfill(axis=1)[df.columns])

这里的想法是左合并,并通过对列进行排序(我们使用'x00'为列的后缀,df2因为它是具有最低 Unicode 值的字符),确保相同的列值最终彼此相邻。然后使用bfill水平更新df1中的值df2


例子:

假设你有df1

   C1 C2   C3  C4
0   1  a  1.0   0
1   1  b  NaN   1
2   2  b  NaN   2
3   2  b  NaN   3

df2

   C1 C2  C3
0   1  b   2
1   2  b   3

df1并且您希望用 中的值填充df2每对C1-C2值对的缺失值。然后

cols_to_be_matched = ['C1', 'C2']

并且上述所有代码均产生以下输出(其中的值确实按要求填充):

   C1 C2   C3  C4
0   1  a  1.0   0
1   1  b  2.0   1
2   2  b  3.0   2
3   2  b  3.0   3
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1989  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1446  
  在当今快速发展的IT行业中,项目管理工具的选择对于项目的成功至关重要。随着技术的不断进步,项目经理们需要更加高效、灵活的工具来应对复杂的项目需求。本文将介绍2025年IT项目经理力推的10款管理工具,帮助您在项目管理中取得更好的成果。信创国产项目管理软件 - 禅道禅道是一款国产开源的项目管理软件,禅道开源版不限人数,功...
项目管理工具   0  
  在当今快速变化的商业环境中,项目管理软件已成为企业提升效率、优化资源分配和确保项目成功的关键工具。随着技术的不断进步,市场上涌现出众多功能各异的项目管理工具,每一款都有其独特的优势和适用场景。本文将深入评测2025年最受欢迎的10款项目管理软件,帮助您根据自身需求做出明智的选择。信创国产项目管理软件 - 禅道禅道是一款...
项目管理平台   2  
  产品开发效率对于企业的竞争力至关重要。在当今复杂多变的商业环境中,如何有效提升产品开发效率成为众多企业关注的焦点。产品生命周期管理(PLM)作为一种整合产品全生命周期信息的管理理念和技术,为提升产品开发效率提供了有力的支持。通过合理运用PLM,企业能够优化流程、加强协作、提高数据管理水平,从而实现产品开发的高效运作。接...
plm开发流程软件   3  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用