Python 从Dataframe中新列的索引中提取数据

Python 从Dataframe中新列的索引中提取数据,python,pandas,numpy,indexing,Python,Pandas,Numpy,Indexing,如何基于不同列中的索引值提取数据 到目前为止,我能够根据同一列中的索引号(5块)提取数据 数据帧如下所示: 3017 39517.3886 3018 39517.4211 3019 39517.4683 3020 39517.5005 3021 39517.5486 5652 39628.1622 5653 39628.2104 5654 39628.2424 5655 39628.2897 5656 39628.3

如何基于不同列中的索引值提取数据

到目前为止,我能够根据同一列中的索引号(5块)提取数据

数据帧如下所示:

3017     39517.3886
3018     39517.4211
3019     39517.4683
3020     39517.5005
3021     39517.5486
5652     39628.1622
5653     39628.2104
5654     39628.2424
5655     39628.2897
5656     39628.3229
5677     39629.2020
5678     39629.2342
5679     39629.2825
5680     39629.3304
5681     39629.3628
其中,列中提取的数据是索引值周围+/-2行

我想要更像这样的东西:

  3017-3021   5652-5656   5677-5681
1 39517.3886  39628.1622  39629.2020
2 39517.4211  39628.2104  39629.2342
3 39517.4683  39628.2424  39629.2825
4 39517.5005  39628.2897  39629.3304
5 39517.5486  39628.3229  39629.3628
依此类推,取决于我要提取的数据数量

我用于根据索引提取数据的代码是:

## find index based on the first 0 of a 000 - 111 list
a = stim_epoc[1:]
ss = [(num+1) for num,i in enumerate(zip(stim_epoc,a)) if i == (0,1)]

## extract data from a df (GCamp_ps) based on the previous index 'ss'
fin = [i for x in ss for i in range(x-2, x + 2 + 1) if i in range(len(GCaMP_ps))]
df = time_fip.loc[np.unique(fin)]
print(df)

形成5个连续行的组(因为从中心拉出+/-2行)。然后创建列和索引标签并
pivot

df = df.reset_index()
s = df.index//5   # If always 5 consecutive values. I.e. +/-2 rows from a center.    

df['col'] = df.groupby(s)['index'].transform(lambda x: '-'.join(map(str, x.agg(['min', 'max']))))
df['idx'] = df.groupby(s).cumcount()

df.pivot(index='idx', columns='col', values=0)  # Assuming column named `0`
输出:
其中索引为+/-2原始。
这是什么意思?当索引更改超过2时,您需要单独的组吗?您可以使用df[“index_col”]=df.index将索引添加为一列,然后从那里开始工作。抱歉,伙计们,我不够清楚。我的意思是,基于索引提取的值是围绕索引值的+/-2个RAW。我想将提取的“块”分组到不同的列中。聪明的解决方案!我喜欢!很好的解决方案-我有一个UDF,它使用图形和连接的组件来完成相同的任务。为了安全起见,是否可以在开头添加排序?“我知道他提供的数据已经整理好了,但如果不是这样的话,它会把这件事搞砸的。”flyingmeatball。是的,我认为如果保证所有组都不会重叠,那么排序是适当和安全的。但是,如果数据是通过采用某种索引和+/2生成的,您可以想象以3000[2998-3002]为中心,然后以3001[2999-3003]为中心。在这种情况下,排序将破坏分组(my
diff
分组将失败),而
df.reset_index().index//5
仍将保留分组,并允许分组重叠,只要它们同时出现。
col   3017-3021   5652-5656   5677-5681
idx                                    
0    39517.3886  39628.1622  39629.2020
1    39517.4211  39628.2104  39629.2342
2    39517.4683  39628.2424  39629.2825
3    39517.5005  39628.2897  39629.3304
4    39517.5486  39628.3229  39629.3628