python - 在列中查找“下一个”非空值
问题描述
我正在尝试创建一个新列,它将下一个非空值的行索引附加到当前非空值旁边,使用以下 df 作为起点:
ts = [
datetime.strptime('2016-06-19 22:01:22.229', '%Y-%m-%d %H:%M:%S.%f'),
datetime.strptime('2016-06-19 23:32:08.109', '%Y-%m-%d %H:%M:%S.%f'),
datetime.strptime('2016-06-20 02:50:22.181', '%Y-%m-%d %H:%M:%S.%f'),
datetime.strptime('2016-06-20 06:12:44.249', '%Y-%m-%d %H:%M:%S.%f'),
datetime.strptime('2016-06-20 19:27:22.129', '%Y-%m-%d %H:%M:%S.%f'),
datetime.strptime('2016-06-21 11:39:08.119', '%Y-%m-%d %H:%M:%S.%f'),
datetime.strptime('2016-06-21 16:59:22.610', '%Y-%m-%d %H:%M:%S.%f')
]
score = [ np.nan, np.nan, 77.692, np.nan, 77.709, np.nan, 76.145 ]
df = pd.DataFrame(data={'date': ts, 'jack': score})
输出将如下所示:
date jack nxt_nn_value
0 2016-06-19 22:01:22.229 NaN NaN
1 2016-06-19 23:32:08.109 NaN NaN
2 2016-06-20 02:50:22.181 77.692 4
3 2016-06-20 06:12:44.249 NaN NaN
4 2016-06-20 19:27:22.129 77.709 6
5 2016-06-21 11:39:08.119 NaN NaN
6 2016-06-21 16:59:22.610 76.145 NaN
我找到了一个涉及该问题的链接,但我无法适应.. 如何在熊猫系列中获得下一个非 NaN 数字的索引?
提前感谢您提供的任何帮助。
解决方案
我们可以在 中找到notnull
值jack
。然后shift
上。然后用于loc
分配结果,并values
打破索引对齐:
m = df['jack'].notnull()
df.loc[m, 'nxt_nn_value'] = pd.Series(m[m].index).shift(-1).values
df
:
date jack nxt_nn_value
0 2016-06-19 22:01:22.229 NaN NaN
1 2016-06-19 23:32:08.109 NaN NaN
2 2016-06-20 22:50:22.181 77.692 4.0
3 2016-06-20 06:12:44.249 NaN NaN
4 2016-06-20 19:27:22.129 77.709 6.0
5 2016-06-21 11:39:08.119 NaN NaN
6 2016-06-21 16:59:22.610 76.145 NaN
解释:
首先找到其中的值在jack
哪里notnull
:
m = df['jack'].notnull()
0 False
1 False
2 True
3 False
4 True
5 False
6 True
Name: jack, dtype: bool
过滤以获取索引有许多等效的方法可以做到这一点:
m[m].index
Int64Index([2, 4, 6], dtype='int64')
然后转换为系列,以便可以移动它,这将给出“下一个”索引:
pd.Series(m[m].index).shift(-1)
0 4.0
1 6.0
2 NaN
dtype: float64
然后仅将值分配回 DataFrame notnull
,values
以打破 Series 和 DataFrame 之间的索引对齐:
df.loc[m, 'nxt_nn_value'] = pd.Series(m[m].index).shift(-1).values
推荐阅读
- flutter - 卡在颤振医生那里,有人可以帮助我吗?
- java - Spring 条件 EventListener 参考被调用 Bean
- javascript - 建议如何在 javascript + socket io 中修复队列音频
- javascript - 在加载亚马逊小部件后执行代码
- amazon-web-services - 使用 AWS Linux EC2 实例创建我自己的代理服务器
- performance - 如何使用像 MediaQuery 这样的内置 InheritedWidget 来实现 Provider.select 行为?
- docker - Gremlin 时间旅行不会更改 Docker 容器上的日期
- node.js - 动态链接错误:从 Node-JS 调用 Go .so 文件时出现 Win32 错误 126
- asp.net-mvc - IIS Express 未在 Visual Studio 2019 中运行
- docker - Eclipse che - 5 个用户同时启动工作区时出现卷挂载错误