python - 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-31
6,因为它有一个H
类型,即它是(2019-08-31, H)
值的两倍。另一方面, 的回填值2019-03-31
与下一行相同,因为该类型是Q
。
规则:
- 类型
H
:回填值的两倍 - 键入
Q
andY
:保留回填的值 - 所有类型:将类型设置为
Q
我找不到任何直接的内置方式来做到这一点。我需要在一个非常大的数据帧上执行此操作,所以速度对我来说很重要,这就是我不能循环的原因。
解决方案
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
推荐阅读
- python - 使用 pandas 组织我的 csv 文件数据
- python - 使用位掩码进行动态编程
- widget - gtk_widget_set_sensitive() 之后的图形变化
- scala - akka http handleNotFound 拒绝仅适用于 POST 方法
- amazon-web-services - 想要从不同的 VPC 成云模板访问 VPC 值
- sql - 获取周和年的第一个和最后一个日期
- android-studio - 为什么每次打开一个新的flutter项目都会出现这个错误?
- angularjs - 无法使用量角器单击 mat-checkbox
- python - Python:使用 .loc[] 从具有 DatetimeIndex 的数据框中排除一年
- python - 如何在 django 中设置 google OAuth 的详细指南?