熊猫填充前操纵值



我想在 pandas 数据帧上使用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-31的回填值为 6,因为它具有H类型,即它是(2019-08-31, H)值的两倍。另一方面,2019-03-31的回填值与下一行相同,因为该类型为Q

规则:

  • 类型H: 回填值的两倍
  • 键入QY:保留回填值
  • 所有类型:将类型设置为Q

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

首先为具有缺失值的行和回填H值创建乘以2的值掩码:

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

这里有一种方法:

# generate a series m, which contains 2 where the
# next value is H
m = df.type.eq('H').shift(-1).add(1).fillna(1)
# Fill missing values in type with H
df.type.fillna('H', inplace = True)
# fillna in val and mulitply with m
df['val'] = df.val.fillna(df.val.shift(-1) * m)

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

哪里:

print(m)
2018-12-31    1
2019-03-31    1
2019-06-30    1
2019-07-31    2
2019-08-31    1
2019-09-30    1
2019-12-31    1
Name: type, dtype: int64

最新更新