2014-09-19 45 views
24

Tôi có một khung dữ liệu df trông như thế này. Ngày và Giờ là 2 chỉ mục đa cấpLàm thế nào để lặp qua gấu trúc multiindex dataframe bằng cách sử dụng chỉ số

      observation1 observation2 
date   Time        
2012-11-02 9:15:00  79.373668  224 
       9:16:00  130.841316  477 
2012-11-03 9:15:00  45.312814  835 
       9:16:00  123.776946  623 
       9:17:00  153.76646  624 
       9:18:00  463.276946  626 
       9:19:00  663.176934  622 
       9:20:00  763.77333  621 
2012-11-04 9:15:00  115.449437  122 
       9:16:00  123.776946  555 
       9:17:00  153.76646  344 
       9:18:00  463.276946  212 

Tôi muốn thực hiện một số quy trình phức tạp trên khối dữ liệu hàng ngày.

mã giả sẽ trông như thế

for count in df(level 0 index) : 
    new_df = get only chunk for count 
    complex_process(new_df) 

Vì vậy, trước hết, tôi không thể tìm thấy một cách để truy cập duy nhất khối cho một ngày

2012-11-03 9:15:00  45.312814  835 
       9:16:00  123.776946  623 
       9:17:00  153.76646  624 
       9:18:00  463.276946  626 
       9:19:00  663.176934  622 
       9:20:00  763.77333  621 

và sau đó gửi nó để xử lý. Tôi đang làm điều này trong vòng lặp vì tôi không chắc chắn nếu có bất kỳ cách nào để làm điều đó mà không đề cập đến giá trị chính xác của cột cấp 0. Tôi đã làm một số tìm kiếm cơ bản và có thể nhận được df.index.get_level_values ​​(0), nhưng nó trả về cho tôi tất cả các giá trị và gây ra vòng lặp để chạy nhiều lần trong một ngày. Tôi muốn tạo một khung dữ liệu mỗi ngày và gửi nó để xử lý.

Trả lời

37

Một cách dễ dàng là để nhóm theo cấp độ đầu tiên của chỉ mục - lặp qua đối tượng nhóm sẽ trả về các khóa nhóm và khung phụ chứa mỗi nhóm.

In [136]: for date, new_df in df.groupby(level=0): 
    ...:  print(new_df) 
    ...:  
        observation1 observation2 
date  Time        
2012-11-02 9:15:00  79.373668   224 
      9:16:00 130.841316   477 

        observation1 observation2 
date  Time        
2012-11-03 9:15:00  45.312814   835 
      9:16:00 123.776946   623 
      9:17:00 153.766460   624 
      9:18:00 463.276946   626 
      9:19:00 663.176934   622 
      9:20:00 763.773330   621 

        observation1 observation2 
date  Time        
2012-11-04 9:15:00 115.449437   122 
      9:16:00 123.776946   555 
      9:17:00 153.766460   344 
      9:18:00 463.276946   212 
+0

Điều đó giúp !. Tôi đã đi theo con đường khá vòng - đầu tiên tìm chỉ số lable và sau đó cắt nó bằng cách sử dụng iloc. – Yantraguru

4

Điều này thì sao?

for idate in df.index.get_level_values('date'): 
    complex_process(df.ix[idate], idate) 
+1

Cẩn thận với giải pháp này, lưu ý rằng mỗi giá trị của idate có thể được nhấn nhiều lần. Bạn nên làm cho idate trong np.unique (df.index.get_level_values ​​('date')): Lưu ý tha bổ sung np.unique. –

+0

Tôi nghĩ 'df.index.get_level_values ​​('date'). Unique()' có thể tốt hơn như @melbay đã chỉ ra. –

0

Gắn thẻ tắt của câu trả lời @psorenson, chúng ta có thể có được chỉ số mức độ độc đáo và nó có liên quan khung dữ liệu lát mà không NumPy như sau:

for date in df.index.get_level_values('date').unique(): 
    print(df.loc[date]) 
Các vấn đề liên quan