Pandas:选择两行之间的所有行

时间:2018-01-02 08:38:02

标签: python pandas

我想获取数据集中位于两行之间且满足特定值的所有行。有可能吗?我无法对数据集进行排序,因为这样一切关键信息都将丢失。

编辑: 数据集包含如下数据:

Index| game_clock| quarter | event_type
0    | 711       | 1       | 1
1    | 710       | 1       | 3
2    | 709       | 2       | 4
3    | 708       | 3       | 2
4    | 707       | 4       | 4
5    | 706       | 4       | 1

我想切片数据集,以便获得event_type(1或2)和(1或2)之间所有行的子集。

编辑2: 假设数据集如下:

    A         B
0   1  0.278179
1   2  0.069914
2   2  0.633110
3   4  0.584766
4   3  0.581232
5   3  0.677205
6   3  0.687155
7   1  0.438927
8   4  0.320927
9   3  0.570552
10  3  0.479849
11  1  0.861074
12  3  0.834805
13  4  0.105766
14  1  0.060408
15  4  0.596882
16  1  0.792395
17  3  0.226356
18  4  0.535201
19  1  0.136066
20  1  0.372244
21  1  0.151977
22  4  0.429822
23  1  0.792706
24  2  0.406957
25  1  0.177850
26  1  0.909252
27  1  0.545331
28  4  0.100497
29  2  0.718721

我想获得的子集索引为:

[0], [1], [2], [3:8], [8:12],
 [12:15], [15:20], [20], [21], [22:24], [24], [25], [26], [27], [28: ]

2 个答案:

答案 0 :(得分:2)

我相信你需要:

a = pd.factorize(df['A'].isin([1,2]).iloc[::-1].cumsum().sort_index())[0]
print (a)
[ 0  1  2  3  3  3  3  3  4  4  4  4  5  5  5  6  6  7  7  7  8  9 10 10 11
 12 13 14 15 15]
dfs = dict(tuple(df.groupby(a)))
print (dfs[0])
   A         B
0  1  0.278179

print (dfs[1])
   A         B
1  2  0.069914

print (dfs[2])
   A        B
2  2  0.63311

print (dfs[3])
   A         B
3  4  0.584766
4  3  0.581232
5  3  0.677205
6  3  0.687155
7  1  0.438927

print (dfs[4])
    A         B
8   4  0.320927
9   3  0.570552
10  3  0.479849
11  1  0.861074

说明:

#check values to boolean mask
a = df['A'].isin([1,2])
#reverse Series
b = df['A'].isin([1,2]).iloc[::-1]
#cumulative sum
c = df['A'].isin([1,2]).iloc[::-1].cumsum()
#get original order
d = df['A'].isin([1,2]).iloc[::-1].cumsum().sort_index()
#factorize for keys in dictionary of DataFrames
e = pd.factorize(df['A'].isin([1,2]).iloc[::-1].cumsum().sort_index())[0]
df = pd.concat([a,pd.Series(b.values),pd.Series(c.values),d,pd.Series(e)], 
               axis=1, keys=list('abcde'))
print (df)
        a      b   c   d   e
0    True   True   1  16   0
1    True  False   1  15   1
2    True   True   2  14   2
3   False   True   3  13   3
4   False   True   4  13   3
5   False   True   5  13   3
6   False   True   6  13   3
7    True  False   6  13   3
8   False   True   7  12   4
9   False   True   8  12   4
10  False   True   9  12   4
11   True  False   9  12   4
12  False  False   9  11   5
13  False   True  10  11   5
14   True  False  10  11   5
15  False   True  11  10   6
16   True  False  11  10   6
17  False  False  11   9   7
18  False   True  12   9   7
19   True  False  12   9   7
20   True  False  12   8   8
21   True  False  12   7   9
22  False   True  13   6  10
23   True  False  13   6  10
24   True  False  13   5  11
25   True  False  13   4  12
26   True  False  13   3  13
27   True   True  14   2  14
28  False   True  15   1  15
29   True   True  16   1  15

答案 1 :(得分:1)

这个清单仍然没有意义。有时你包括第一次出现,有时不包括。试试这个:

import pandas as pd
import numpy as np

np.random.seed(314) 
df = pd.DataFrame({'A': np.random.choice([1,2,3,4], 30), 'B':np.random.rand(30)})

ar = np.where(df.A.isin((1,2)))[0]
ids = list(zip(ar,ar[1:]))

for item in ids:
    print(df.iloc[item[0]:item[1],:])

ids现在是:

[(0, 1), (1, 2), (2, 7), (7, 11), (11, 14), (14, 16), (16, 19), (19, 20),
(20, 21), (21, 23), (23, 24), (24, 25), (25, 26), (26, 27), (27, 29)]

这将在开始时包含1或2,最后在1,2中停止。