python - 两个现有的 Numpy 数组,有条件地填充 NaN
问题描述
对于大型数据集中的每个组件,我有两个形状相同的 numpy 数组:原始数据和工件数据,存储在 pandas 数据框中,如下所示:
sub run1 ... run4
0 [data, art] ... [data, art]
1 [data, art] ... [data, art]
2 [data, art] ... [data, art]
3 [data, art] ... [data, art]
4 [data, art] ... [data, art]
例如:主题 1 运行 1 有
data([[104., 96., 94., ..., 99., 99., 96.],
[102., 94., 92., ..., 100., 99., 97.],
[101., 93., 91., ..., 98., 98., 96.],
...,
[ -8., -5., -12., ..., -9., 3., 10.],
[ -8., -5., -13., ..., -10., 4., 11.],
[ -9., -5., -13., ..., -10., 5., 13.]])
和
artifact([[2., 2., 2., ..., 2., 2., 2.],
[2., 2., 2., ..., 2., 2., 2.],
[2., 2., 2., ..., 2., 2., 2.],
...,
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.]])
当工件数组中的值不为0时,我想将数据数组中的相应位置替换为NaN。这可以在原地或在新阵列中完成。每次运行的受试者之间的长度不一定相同。
解决方案
在 Pandas 中使用循环(就像 Clayton 的答案一样)会导致性能不佳并使代码更难阅读。只要有可能,让 Pandas 为您处理迭代,如下所示:
def replace_values(item):
"""Operate on a single DataFrame cell
"""
data = item[0]
artifact = item[1]
data[artifact == 0] = np.nan
return [data, artifact]
df.applymap(replace_values)
这是一个重要的实践和方法论点。从根本上讲,Pandas 的主要卖点之一是它包含许多处理复杂操作的函数,省去了编写迭代控制结构的麻烦,并且运行速度更快。
从方法论上讲,这些“捆绑”操作使您不必考虑细节。用简单的英语,我的解决方案说:“这是一个在单元格上运行的函数。将它应用于每个单元格。” 简洁明了,一目了然,只要你知道是做什么applymap
的。您不必通读显式循环语法来弄清楚发生了什么。
是的,有一点学习曲线,但这是值得的。
推荐阅读
- java - Swagger 生成的 java 对象不会正确映射 JSON 请求
- kubernetes - 如何以编程方式检测 kubernetes 集群是否已经有入口控制器?
- node.js - Cloud Function 停止响应随机外部 API 调用
- python - 当张量中有未知元素时,操纵张量形状的正确方法是什么?
- java - 已知格式时从字符串解析 JSON 的最快方法
- docker-compose - 如何在没有项目名称的情况下运行 docker-compose?
- excel - 循环查找 2 个字符串并复制到新工作表
- android - 有没有办法检查用户是否已经安装了应用程序
- mysql - 如何并排比较两个mysql表
- graphql - Apollo 联合网关背后的 Hasura GraphQL 端点