簡體   English   中英

根據 pandas/NumPy 中的多個切片選擇子集?

[英]Selecting a subset based on multiple slices in pandas/NumPy?

我想 select 基於幾個切片的一些 pandas 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']]

預期 output:

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

我已經看到 NumPy 的r_ object 在想要使用多個切片時可以提供幫助,例如:

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

這讓我得到了我需要的東西,但是還有其他更快/更清潔/首選/無論如何的方法嗎?

你可以做:

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

使用np.hstack選項花費了大約 1/4 的時間。

有點晚了,但它也可能對其他人有所幫助:

pd.concat([df.loc[sl, ['B', 'C']] for sl in [slice(1, 4), slice(42, 44)]])

當您處理其他切片時,這也適用,例如時間 windows。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM