首页 > 解决方案 > 在列中查找“下一个”非空值

问题描述

我正在尝试创建一个新列,它将下一个非空值的行索引附加到当前非空值旁边,使用以下 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 数字的索引?

提前感谢您提供的任何帮助。

标签: pythonpandasindexing

解决方案


我们可以在 中找到notnulljack。然后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 notnullvalues以打破 Series 和 DataFrame 之间的索引对齐:

df.loc[m, 'nxt_nn_value'] = pd.Series(m[m].index).shift(-1).values

推荐阅读