Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 当列值在另一行-列值的范围内时,选择行_Python_Pandas - Fatal编程技术网

Python 当列值在另一行-列值的范围内时,选择行

Python 当列值在另一行-列值的范围内时,选择行,python,pandas,Python,Pandas,我正在尝试从数据帧(100k-500k行)创建子集 使用以下格式 d = {'time':[1,2,3,5,7,9,9.5,10], 'val':['match','match','match','not','not','match','match','match']} df = pd.DataFrame(d) time val 0 1.0 match 1 2.0 match 2 3.0 match 3 5.0 not 4 7.0 not 5

我正在尝试从数据帧(100k-500k行)创建子集 使用以下格式

d = {'time':[1,2,3,5,7,9,9.5,10], 'val':['match','match','match','not','not','match','match','match']}
df = pd.DataFrame(d)

   time    val
0   1.0  match
1   2.0  match
2   3.0  match
3   5.0    not
4   7.0    not
5   9.0  match
6   9.5  match
7  10.0  match
我想选择一个子集,当time在 范围有限。
例如,如果范围我得到了一个解决方案,但我认为这不是最好的解决方案

dfasc=df.sort_values(['time'], ascending=1)
dfdesc=df.sort_values(['time'], ascending=0)

print (df[(dfasc['time'].diff()<=1.0) | (dfdesc['time'].diff()>=-1.0)])

   time    val
0   1.0  match
1   2.0  match
2   3.0  match
5   9.0  match
6   9.5  match
7  10.0  match
dfasc=df.sort_值(['time'],升序=1)
dfdesc=df.sort_值(['time'],升序=0)
打印(df[(dfasc['time'].diff()=-1.0)])
时间值
0.1.0比赛
1.2.0比赛
2.3.0比赛
5.9.0比赛
6.9.5比赛
7.10.0比赛

如果您想这样做,它是矢量化的,这将起作用。您可能希望使用矢量化操作,因为您的DF非常大。您可能还希望将其放入函数中以节省内存,因为我在下面创建了一些变量

import numpy as np
import pandas as pd
df = pd.DataFrame({'time':[1,2,2.5,3,9,9.5,10,11,12],'val':
['not','match','match','match','match','match','match','not','not']})
'''
df
   time    val
0   1.0    not
1   2.0  match
2   2.5  match
3   3.0  match
4   9.0  match
5   9.5  match
6  10.0  match
7  11.0    not
8  12.0    not
'''
x = df.time.values
tmp = (x[1:] - x[:-1]) < 1
fst = tmp[0]
lst = tmp[-1]
mid = np.any([tmp[1:],tmp[:-1]],axis =0)
ans = np.concatenate([[fst],mid,[lst]])
df  = df[ans]
''' Output
   time    val
1   2.0  match
2   2.5  match
3   3.0  match
4   9.0  match
5   9.5  match
6  10.0  match
'''
将numpy导入为np
作为pd进口熊猫
数据帧({'time':[1,2,2.5,3,9,9.5,10,11,12],'val':
[‘不’、‘匹配’、‘匹配’、‘匹配’、‘匹配’、‘匹配’、‘匹配’、‘不’、‘不’])
'''
df
时间值
0 1.0不是
1.2.0比赛
2.5比赛
3.0比赛
4.9.0比赛
5.9.5比赛
6.10.0比赛
7.11.0不是
8 12.0不是
'''
x=df.time.values
tmp=(x[1:]-x[:-1])<1
fst=tmp[0]
lst=tmp[-1]
mid=np.any([tmp[1:],tmp[:-1]],轴=0)
ans=np.concatenate([[fst],mid,[lst]]))
df=df[ans]
''输出
时间值
1.2.0比赛
2.5比赛
3.0比赛
4.9.0比赛
5.9.5比赛
6.10.0比赛
'''

在一行中,它看起来是这样的:

df.loc[(df['time'].diff()<=1)|(df['time'].diff(-1)>=-1)]
df.loc[(df['time'].diff()=-1)]

如果范围是df.time[1]-df.time[0]是1,那么第0,1行是有效的,df.time[2]-df.time[1]是1,那么第1,2行是有效的,我不明白,为什么
3,4
行无效?要使第3行有效,另一行必须存在于范围内的时间(4,6),要使第4行有效,另一行必须存在于范围内的时间(6,8)我不认为这是可行的,print(bln)给出[False False False True]@user3394220 fixed你能更具体一点吗?我正在尝试生成在1行中不起作用的数据样本,在3行解决方案中起作用请这样做。我的解决方案假设您不想对数据进行重新排序。我只是问了这个问题的扩展部分,希望您能提供帮助:)
df.loc[(df['time'].diff()<=1)|(df['time'].diff(-1)>=-1)]