python - 从 Pandas Dataframe 中的最后一个有效行填充无效的 x,y 位置数据
问题描述
假设我有一个如下数据框:
time id x y
0 1 23.1 12.7
0 2 12.2 32
0 3 232.2 76.3
1 1 -9999 -9999
1 2 98 55.7
1 3 67 54
2 1 56.8 56.8
2 2 99 -9999
2 3 443.4 34
x 或 y 列中等于 -9999 的值无效。我想将此值更改为与前一个 ['time'] 值的 row['id'] 值匹配的值。例如,在时间 = 2 时 id = 3 的 y 值无效的行希望在时间 = 1 时将 y 值替换为 id = 3。
这将变成如下:
time id x y
0 1 23.1 12.7
0 2 12.2 32
0 3 232.2 76.3
1 1 23.1 12.7
1 2 98 55.7
1 3 67 54
2 1 56.8 56.8
2 2 99 55.7
2 3 443.4 34
我将如何处理这个(最好没有迭代)?我已经查看了 ffill 方法,但我不确定如何在指定它应该从先前匹配的 id 号填充时使其工作。我相信第一步是将 -9999 值填充为 NA,但我不确定如何从那里开始。
几点注意事项:
- 数据按时间顺序排列
- 每个时间步可能有不同数量的 id 值(例如,我不能只用第 3 行值填充它)
- id 值在每个时间步内可能没有任何顺序
谢谢!
解决方案
如果时间值是连续的,您可以用-9999
每组前向填充的缺失值替换缺失值:
df[['x','y']] = df[['x','y']].replace(-9999, np.nan).groupby(df['id']).ffill()
print (df)
time id x y
0 0 1 23.1 12.7
1 0 2 12.2 32.0
2 0 3 232.2 76.3
3 1 1 23.1 12.7
4 1 2 98.0 55.7
5 1 3 67.0 54.0
6 2 1 56.8 56.8
7 2 2 99.0 55.7
8 2 3 443.4 34.0
推荐阅读
- html - 使图片行扩展以适应可用空间
- angular - Angular包的格式有什么区别
- mysql - 从 java.sql.Date 到 java.time.LocalDate 的 Hibernate 本机 SQL 查询类型映射
- c++ - 显示 cv2 Mat 的差异
- c++ - 如何使用 < 和 > 命令在 c++ 中获取输入和输出?
- java - 无法从列表中投射
列出 - kubernetes - Kubernetes:kubeadm 加入主节点失败
- ios - 崩溃:Container.swift 第 242 行 Container.resolve(条目:调用者:)
- node.js - SyntaxError:意外的标识符 PriorityNode.prototype.removeChildren
- java - 需要有关扫描仪错误 java.util.NoSuchElementException 的帮助