首页 > 解决方案 > Pandas bfill 在填充前操纵值

问题描述

我想bfill在熊猫数据框上使用,但我希望用于每个回填的值取决于行中的值。

示例输入:

           type   val
2018-12-31    H     1
2019-03-31  NaN   NaN
2019-06-30    Q     2
2019-07-31  NaN   NaN
2019-08-31    H     3
2019-09-30    Y     4 
2019-12-31    Q     5

预期输出:

           type   val
2018-12-31    H     1
2019-03-31    Q     2  <-- Same as 2019-06-30
2019-06-30    Q     2
2019-07-31    Q     6  <-- Double 2019-08-31
2019-08-31    H     3
2019-09-30    Y     4
2019-12-31    Q     5

在本例中,回填值为2019-07-316,因为它有一个H类型,即它是(2019-08-31, H)值的两倍。另一方面, 的回填值2019-03-31与下一行相同,因为该类型是Q

规则:

我找不到任何直接的内置方式来做到这一点。我需要在一个非常大的数据帧上执行此操作,所以速度对我来说很重要,这就是我不能循环的原因。

标签: pythonpandas

解决方案


2首先为缺少值的行和回填值创建乘以值的掩码H

m = df['type'].isna() & df['type'].bfill().eq('H')

然后通过掩码回填val和乘以的值:2

df['val'] = df['val'].bfill().mask(m, lambda x: x * 2)

最后替换type列中的缺失值:

df['type'] = df['type'].fillna('Q')
print (df)
           type  val
2018-12-31    H  1.0
2019-03-31    Q  2.0
2019-06-30    Q  2.0
2019-07-31    Q  6.0
2019-08-31    H  3.0
2019-09-30    Y  4.0
2019-12-31    Q  5.0

推荐阅读