熊猫从另一个数据框中填充数据框中的缺失值
- 2025-02-20 09:25:00
- admin 原创
- 27
问题描述:
我找不到 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, A
和eee, 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_first
和fillna
在索引上匹配,因此您必须使 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
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 项目管理必备:盘点2024年13款好用的项目管理软件
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)