2013-07-03 35 views
6

Trong gấu trúc làm thế nào để tôi chia Loạt/dataframe thành hai Series/DataFrames nơi các hàng lẻ trong một Series, thậm chí các hàng khác nhau? Hiện tại, tôi đang sử dụngchia khung dữ liệu dựa trên chỉ số nguyên

rng = range(0, n, 2) 
odd_rows = df.iloc[rng] 

Điều này khá chậm.

Trả lời

13

Sử dụng miếng:

In [11]: s = pd.Series([1,2,3,4]) 

In [12]: s.iloc[::2] # even 
Out[12]: 
0 1 
2 3 
dtype: int64 

In [13]: s.iloc[1::2] # odd 
Out[13]: 
1 2 
3 4 
dtype: int64 
3

Dưới đây là một số comparisions

In [100]: df = DataFrame(randn(100000,10)) 

phương pháp đơn giản (nhưng tôi nghĩ nhiều làm cho điều này chậm), nhưng sẽ làm việc không phụ thuộc vào chỉ số (ví dụ như không phải là một chỉ số bằng số)

In [96]: %timeit df.iloc[range(0,len(df),2)] 
10 loops, best of 3: 21.2 ms per loop 

Sau đây yêu cầu Int64Index dựa trên phạm vi (rất dễ nhận, chỉ reset_index()).

In [107]: %timeit df.iloc[(df.index % 2).astype(bool)] 
100 loops, best of 3: 5.67 ms per loop 

In [108]: %timeit df.loc[(df.index % 2).astype(bool)] 
100 loops, best of 3: 5.48 ms per loop 

đảm bảo để cho nó vị trí index

In [98]: %timeit df.take(df.index % 2) 
100 loops, best of 3: 3.06 ms per loop 

tương tự như trên nhưng không có chuyển đổi trên indicies tiêu cực

In [99]: %timeit df.take(df.index % 2,convert=False) 
100 loops, best of 3: 2.44 ms per loop 

chiến thắng này được @AndyHayden soln; tính năng này chỉ hoạt động trên một loại dtype đơn lẻ

In [118]: %timeit DataFrame(df.values[::2],index=df.index[::2]) 
10000 loops, best of 3: 63.5 us per loop 
Các vấn đề liên quan