python - 前向填充熊猫数据框中的自定义值
问题描述
我希望对一些数据框列执行前向填充。该ffill
方法将缺失值或 NaN 替换为先前填充的值。就我而言,我想执行前向填充,不同之处在于我不想在 Nan 上执行此操作,而是针对特定值(例如“*”)。
这是一个例子
import pandas as pd
import numpy as np
d = [{"a":1, "b":10},
{"a":2, "b":"*"},
{"a":3, "b":"*"},
{"a":4, "b":"*"},
{"a":np.nan, "b":50},
{"a":6, "b":60},
{"a":7, "b":70}]
df = pd.DataFrame(d)
与df
存在
a b
0 1.0 10
1 2.0 *
2 3.0 *
3 4.0 *
4 NaN 50
5 6.0 60
6 7.0 70
预期的结果应该是
a b
0 1.0 10
1 2.0 10
2 3.0 10
3 4.0 10
4 NaN 50
5 6.0 60
6 7.0 70
np.nan
如果到那时替换“*” ffill
,那将导致应用于ffill
列a
。
由于我的数据有数百列,我想知道是否有比遍历所有列更有效的方法,检查它是否包含“*”,然后替换和填充。
解决方案
我认为您正朝着正确的方向前进,但这是一个完整的解决方案。我正在做的是“标记”原始 NaN 值,然后用 NaN 替换“*”,使用ffill
,然后将原始 NaN 值放回原处。
df = df.replace(np.NaN, "<special>").replace("*", np.NaN).ffill().replace("<special>", np.NaN)
输出:
a b
0 1.0 10.0
1 2.0 10.0
2 3.0 10.0
3 4.0 10.0
4 NaN 50.0
5 6.0 60.0
6 7.0 70.0
这是一个替代解决方案,它做同样的事情,没有“特殊”标记:
original_nan = df.isna()
df = df.replace("*", np.NaN).ffill()
df[original_nan] = np.NaN
推荐阅读
- java - Hibernate/Spring 的类加载泄漏
- file-rename - 如何附加带有索引号的文件名
- c - 如何调用函数并结束当前函数
- stripe-payments - 当你有密钥时如何获得条带公钥?
- python - 无法从 Linux 虚拟网络接口发送/接收单播以太网数据包
- matlab - 从下标参考中查找每个维度中的所有索引位置
- r - mlr3 中的 randomForest 在计算特征重要性分数时抛出错误
- reactjs - 如何从数据网格中获取隐藏列
- laravel - Laravel“队列:修剪批次”未定义
- c# - 我在上下文中进行了配置,但它创建了新的列 ef 核心迁移?