Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.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_Algorithm_Python 3.x_Pandas - Fatal编程技术网

Python 确定数据帧列中相同类型邻居范围的最快方法

Python 确定数据帧列中相同类型邻居范围的最快方法,python,algorithm,python-3.x,pandas,Python,Algorithm,Python 3.x,Pandas,在PANDASdataframe中获取相同类型邻居范围的最快方法是什么? 问题是我有一个数据帧,它在input列中排序,我需要知道这些值的范围,列output的值彼此相近 我做了什么? 我写了一个满足我需要的程序: data = pd.read_csv('data.txt') print("Original Data:") print(data) tmpdata = data.copy() slicedorg = data.copy() jump = 0 to = 0 while jump &l

PANDAS
dataframe中获取相同类型邻居范围的最快方法是什么?
问题是我有一个数据帧,它在
input
列中排序,我需要知道这些值的范围,列
output
的值彼此相近

我做了什么?
我写了一个满足我需要的程序:

data = pd.read_csv('data.txt')
print("Original Data:")
print(data)
tmpdata = data.copy()
slicedorg = data.copy()
jump = 0
to = 0
while jump < len(data):
    tmpdata['output'] = (slicedorg['output'] == slicedorg['output'].loc[0])
    jump += to
    try:
        to = tmpdata['output'].tolist().index(False)
        if jump == 0:
            data['input'] = data['input'].replace([data['input'].loc[range(jump, to + jump)]] 
                                                                    , "(begin," + str(data['input'].loc[jump + to]) + ")" )
        else:
            data['input'] = data['input'].replace([data['input'].loc[range(jump, to + jump)]] 
                                                                    , "[" + str(data['input'].loc[jump]) + "," 
                                                                        + str(data['input'].loc[jump + to]) + ")")
        tmpdata = tmpdata.tail(len(tmpdata) - to)
        slicedorg = slicedorg.tail(len(slicedorg) - to)
        tmpdata = tmpdata.reset_index(drop=True)
        slicedorg = slicedorg.reset_index(drop=True)
    except:
        data['input'] = data['input'].replace([slicedorg['input'].loc[range(0, len(data))]] 
                                                                , "[" + str(tmpdata['input'].loc[0]) + ",end)")
        break
print("\nAfter Altering:")
print(data)  
尽管这段代码对我来说很有用,但我的数据表非常庞大,制作两个数据副本并循环遍历列非常耗时,有没有更好的方法来完成我想要的?请注意,也许我没有写一个很好的代码(我是python新手),但我主要是在寻找更快的建议算法

我正在使用python 3.5和pandas的最新版本。

谢谢

我太懒了,无法完全按照您想要的方式获取格式,但您可以使用compare cumsum groupby模式完成困难的部分:

group_ids = (df["output"] != df["output"].shift()).cumsum()
grouped = df["input"].groupby(group_ids)
bounds = grouped.min().shift(-1)

left = bounds.shift(1).fillna(0).astype(int).astype(str)
right = bounds.fillna(0).astype(int).astype(str)

left.iloc[0] = "begin"
right.iloc[-1] = "end"
bounds = left + "," + right

df["bounds"] = bounds.loc[group_ids].values
给我

>>> df
    input output    bounds
0       3   gear  begin,55
1       7   gear  begin,55
2      11   gear  begin,55
3      24   gear  begin,55
4      55   back    55,100
5      56   back    55,100
6      82   back    55,100
7     100   gear   100,200
8     101   gear   100,200
9     200   peak   200,end
10    208   peak   200,end
11    233   peak   200,end

谢谢你的回答@DSM,但是你能逐行解释清楚你的代码在做什么吗?
>>> df
    input output    bounds
0       3   gear  begin,55
1       7   gear  begin,55
2      11   gear  begin,55
3      24   gear  begin,55
4      55   back    55,100
5      56   back    55,100
6      82   back    55,100
7     100   gear   100,200
8     101   gear   100,200
9     200   peak   200,end
10    208   peak   200,end
11    233   peak   200,end