如何使用python在pandas中查找带逻辑的索引?

时间:2018-06-15 07:49:24

标签: python pandas

这是我的数据:

           time           id    w
0   2018-03-01 00:00:00 39.0    1176.000000
1   2018-03-01 00:15:00 39.0    NaN
2   2018-03-01 00:30:00 39.0    NaN
3   2018-03-01 00:45:00 39.0    NaN
4   2018-03-01 01:00:00 39.0    NaN
5   2018-03-01 01:15:00 39.0    NaN
6   2018-03-01 01:30:00 39.0    NaN
7   2018-03-01 01:45:00 39.0    1033.461538
8   2018-03-01 02:00:00 39.0    1081.066667
9   2018-03-01 02:15:00 39.0    1067.909091
10  2018-03-01 02:30:00 39.0    NaN
11  2018-03-01 02:45:00 39.0    1051.866667
12  2018-03-01 03:00:00 39.0    1127.000000
13  2018-03-01 03:15:00 39.0    1047.466667
14  2018-03-01 03:30:00 39.0    1037.533333

我想索引:10

因为我需要知道哪个时间不连续,我需要添加值。

我想知道每个'时间'前后是否有NAN。如果不是我需要知道它索引。我需要为它增加价值。

我的数据非常庞大。我需要更快的方式。

我真的需要你的帮助。非常感谢。

2 个答案:

答案 0 :(得分:1)

这应该非常快:

import numpy as np

index = np.array([4561,4723,4724,4725,4726,5154,5220,5221,5222,5223,5224,5293,5437,5484,5485,5486,5487])

continuous = np.diff(index) == 1
not_continuous = np.where(~continuous[1:] & ~continuous[:-1])[0] + 1 # check on both 'sides', +1 because you 'loose' one index in the diff operation
index[not_continuous]

array([5154, 5293, 5437])

它不能很好地处理第一个值,但这是非常模糊的,因为您没有要检查的先前值。如果对您来说重要,请添加此额外检查...可能与最后一个值相同。

答案 1 :(得分:1)

不确定我是否理解正确。如果您希望列time的索引更改超过15分钟,则索引的索引将超过4,您可以这样做:

df['time'] =  pd.to_datetime(df['time'], format='%Y-%m-%d %H:%M:%S')
df['Delta']=(df['time'].subtract(df['time'].shift(1)))
df['Delta'] = df['Delta'].astype(str)
print df.index[df['Delta'] != '0 days 00:15:00.000000000'].tolist()

输出是:

[4561, 4723, 5154, 5220, 5293, 5437, 5484]

修改

同样,如果我理解你的话,就这样使用:

df.index[(pd.isnull(df['w'])) & (pd.notnull(df['w'].shift(1))) & (pd.notnull(df['w'].shift(-1)))].tolist()

输出:

[10]