Выбор подмножества на основе нескольких срезов в пандах / NumPy? - PullRequest
0 голосов
/ 24 октября 2019

Я хочу выбрать подмножество некоторых панд столбцов 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

, который дает мне то, что мне нужно, но есть ли другие быстрее /чище / предпочтительнее / каким образом это сделать?

1 Ответ

0 голосов
/ 24 октября 2019

Вы можете сделать:

df.loc[[x for x in range(1, 4)] + [x for x in range(42, 44)], ['B', 'C']]

Это заняло около 1/4 времени с вашей опцией np.hstack.

...