Я хочу выбрать подмножество некоторых панд столбцов DataFrame на основе нескольких срезов.
In [1]: df = pd.DataFrame(data={'A': np.random.rand(100), 'B': np.random.rand(100), 'C': np.random.rand(100)})
df.head()
Out[1]: A B C
0 0.745487 0.146733 0.594006
1 0.212324 0.692727 0.244113
2 0.954276 0.318949 0.199224
3 0.606276 0.155027 0.247255
4 0.155672 0.464012 0.229516
Что-то вроде:
In [2]: df.loc[[slice(1, 4), slice(42, 44)], ['B', 'C']]
Ожидаемый результат:
Out[2]: B C
1 0.692727 0.244113
2 0.318949 0.199224
3 0.155027 0.247255
42 0.335285 0.000997
43 0.019172 0.237810
Я видел, что r_ объект NumPy может помочь, когдажелая использовать несколько слайсов, например:
In [3]: arr = np.array([1, 2, 3, 4, 5, 5, 5, 5])
arr[np.r_[1:3, 4:6]]
Out[3]: array([2, 3, 5, 5])
Но я не могу заставить это работать с некоторой предопределенной коллекцией (списком) ломтиков. В идеале я хотел бы иметь возможность указать коллекцию диапазонов / срезов и подмножеств на основе этого. Мне не кажется, что r_
принимает итерации? Я видел, что можно, например, создать массив с hstack
, а затем использовать его в качестве индекса, например:
In [4]: idx = np.hstack((np.arange(1, 4), np.arange(42, 44)))
df.loc[idx, ['B', 'C']]
Out[4]: B C
1 0.692727 0.244113
2 0.318949 0.199224
3 0.155027 0.247255
42 0.335285 0.000997
43 0.019172 0.237810
, который дает мне то, что мне нужно, но есть ли другие быстрее /чище / предпочтительнее / каким образом это сделать?