[英]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.