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

2025-02-20 09:25:00
admin
原创
27
摘要:问题描述:我找不到 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
相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1267  
  IPD(Integrated Product Development)即集成产品开发,是一套先进的、成熟的产品开发管理理念、模式和方法。随着市场竞争的日益激烈,企业对于提升产品开发效率、降低成本、提高产品质量的需求愈发迫切,IPD 项目管理咨询市场也迎来了广阔的发展空间。深入探讨 IPD 项目管理咨询的市场需求与发展,...
IPD集成产品开发流程   27  
  IPD(Integrated Product Development)产品开发流程是一套先进的、被广泛应用的产品开发管理体系,它涵盖了从产品概念产生到产品推向市场并持续优化的全过程。通过将市场、研发、生产、销售等多个环节紧密整合,IPD旨在提高产品开发的效率、质量,降低成本,增强企业的市场竞争力。深入了解IPD产品开发...
IPD流程中TR   31  
  IPD(Integrated Product Development)测试流程是确保产品质量、提升研发效率的关键环节。它贯穿于产品从概念到上市的整个生命周期,对企业的成功至关重要。深入理解IPD测试流程的核心要点,有助于企业优化研发过程,打造更具竞争力的产品。以下将详细阐述IPD测试流程的三大核心要点。测试策略规划测试...
华为IPD   26  
  华为作为全球知名的科技企业,其成功背后的管理体系备受关注。IPD(集成产品开发)流程作为华为核心的产品开发管理模式,在创新管理与技术突破方面发挥了至关重要的作用。深入剖析华为 IPD 流程中的创新管理与技术突破,对于众多企业探索自身发展路径具有重要的借鉴意义。IPD 流程概述IPD 流程是一种先进的产品开发管理理念和方...
TR评审   26  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用