我想在 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
: 回填值的两倍 - 键入
Q
和Y
:保留回填值 - 所有类型:将类型设置为
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