2012-06-14 43 views
9

Tôi đang sử dụng gói pandas tuyệt vời để xử lý một lượng lớn dữ liệu chẩn đoán khí tượng đa dạng và tôi nhanh chóng hết kích thước khi tôi ghép dữ liệu lại với nhau. Nhìn vào tài liệu, có thể sử dụng MultiIndex có thể giải quyết được vấn đề của tôi, nhưng tôi không chắc chắn cách áp dụng nó cho tình huống của mình - tài liệu này cho thấy ví dụ về việc tạo MultiIndexes với dữ liệu ngẫu nhiên và DataFrame s. dữ liệu về thời gian tồn tại.Làm cách nào để tổng hợp nhóm dữ liệu gấu trúc của tôi thành hơn 3 thứ nguyên?

nền

Cấu trúc dữ liệu cơ bản tôi đang sử dụng có chứa hai lĩnh vực chính:

  • metadata, đó là một cuốn từ điển gồm cặp khóa-giá trị mô tả những gì các con số
  • data, là cấu trúc dữ liệu gấu trúc chứa chính các số.

Các mẫu số chung thấp nhất là dữ liệu chuỗi thời gian, vì vậy cấu trúc cơ bản có một gấu trúc đối tượng Series như mục data, và lĩnh vực metadata mô tả những gì những con số thực sự là (ví dụ vector lỗi RMS cho gió 10 mét so với Đông Thái Bình Dương cho một dự báo 24 giờ từ thử nghiệm Test1).

Tôi đang xem xét mẫu số chung thấp nhất và dán các khoảng thời gian khác nhau lại với nhau để làm cho kết quả hữu ích hơn và cho phép kết hợp dễ dàng. Ví dụ: tôi có thể xem tất cả các thời gian chờ khác nhau - tôi có thói quen lọc sẽ sử dụng thời gian chờ chia sẻ cùng một mục nhập siêu dữ liệu ngoại trừ cho thời gian dẫn (ví dụ: thử nghiệm, khu vực, v.v.) đối tượng trong đó trường metadata chỉ bao gồm các mục nhập phổ biến (ví dụ: Lead Time đã bị xóa) và bây giờ trường data là gấu trúc DataFrame với các nhãn cột được cung cấp bởi giá trị Lead Time. Tôi có thể mở rộng lại điều này và nói rằng tôi muốn chụp các khung và nhóm kết quả là chúng cùng với một mục nhập khác khác nhau (ví dụ: Experiment) để tặng cho tôi gấu trúc Panel. cho mục nhập của tôi trong đó chỉ mục mục được cung cấp bởi các giá trị siêu dữ liệu Experiment từ các khung thành phần và siêu dữ liệu mới của đối tượng không chứa Lead Time hoặc Experiment.

Khi tôi lặp qua các đối tượng hỗn hợp này, tôi có thói quen iterseries cho khung và iterframes thường trình cho bảng điều khiển tái tạo kết nối siêu dữ liệu/dữ liệu thích hợp khi tôi thả một thứ nguyên (tức là chuỗi từ khung có thời gian dẫn thay đổi trên các cột sẽ có tất cả siêu dữ liệu của trường mẹ trường Lead Time được khôi phục với giá trị được lấy từ nhãn cột). Điều này làm việc tuyệt vời.

Vấn đề

tôi đã chạy ra khỏi kích thước (tối đa 3-D với một Panel) và tôi cũng không thể sử dụng những thứ như dropna để loại bỏ cột rỗng khi tất cả mọi thứ được liên kết trong Bảng điều khiển (điều này đã dẫn đến một số lỗi khi vẽ sơ đồ thống kê tóm tắt). Đọc về việc sử dụng gấu trúc với dữ liệu chiều cao đã dẫn đến việc đọc về số MultiIndex và cách sử dụng nó. Tôi đã thử các ví dụ được đưa ra trong tài liệu, nhưng tôi vẫn còn một chút không rõ ràng làm thế nào để áp dụng nó vào tình hình của tôi. Mọi hướng sẽ hữu ích.Tôi muốn để có thể:

  • Kết hợp Series dữ liệu dựa trên của tôi vào một đa-lập chỉ mục DataFrame cùng một số tùy ý kích thước (điều này sẽ là tuyệt vời - nó sẽ loại bỏ một cuộc gọi để tạo ra các khung hình từ và sau đó một lần nữa để tạo các bảng từ khung)
  • Lặp lại kết quả được lập chỉ mục nhiều DataFrame, thả một thứ nguyên duy nhất để tôi có thể đặt lại siêu dữ liệu thành phần.

Edit - Add Mã mẫu

Wes McKinney của câu trả lời dưới đây là gần như chính xác những gì tôi cần - vấn đề là trong bản dịch ban đầu từ các đối tượng lưu trữ Series-ủng hộ tôi phải làm việc với để DataFrame của tôi -backed objects khi tôi bắt đầu nhóm các phần tử lại với nhau. Lớp Data-Frame-backed có phương thức sau đây có trong danh sách các đối tượng dựa trên chuỗi và trường siêu dữ liệu sẽ thay đổi trên các cột.

@classmethod 
def from_list(cls, results_list, column_key): 
    """ 
    Populate object from a list of results that all share the metadata except 
    for the field `column_key`. 

    """ 
    # Need two copies of the input results - one for building the object 
    # data and one for building the object metadata 
    for_data, for_metadata = itertools.tee(results_list) 

    self    = cls() 
    self.column_key = column_key 
    self.metadata = next(for_metadata).metadata.copy() 
    if column_key in self.metadata: 
     del self.metadata[column_key] 
    self.data = pandas.DataFrame(dict(((transform(r[column_key]), r.data) 
             for r in for_data))) 
    return self 

Khi tôi đã có khung do thói quen này, tôi có thể dễ dàng áp dụng các hoạt động khác nhau gợi ý dưới đây - các tiện ích đặc biệt là khả năng sử dụng trường names khi tôi gọi concat - điều này loại bỏ nhu cầu lưu trữ tên của khóa cột trong nội bộ vì tên cột được lưu trữ trong MultiIndex làm tên của thứ nguyên chỉ mục đó.

Tôi muốn có thể triển khai giải pháp bên dưới và chỉ đưa vào danh sách các lớp được hỗ trợ Series phù hợp và danh sách khóa và thực hiện nhóm theo tuần tự. Tuy nhiên, tôi không biết những gì các cột sẽ được đại diện trước thời hạn, vì vậy:

  • nó thực sự không có ý nghĩa với tôi để lưu trữ các dữ liệu Series trong một 1-D DataFrame
  • tôi don 't xem làm thế nào để thiết lập tên của chỉ số và các cột từ series ban đầu -> Khung nhóm

Trả lời

9

tôi có thể đề nghị sử dụng pandas.concat cùng với keys đối số của nó để dán lại với nhau Dòng DataFrames để tạo ra một MultiIndex trong cột:

In [20]: data 
Out[20]: 
{'a': 2012-04-16 0 
2012-04-17 1 
2012-04-18 2 
2012-04-19 3 
2012-04-20 4 
2012-04-21 5 
2012-04-22 6 
2012-04-23 7 
2012-04-24 8 
2012-04-25 9 
Freq: D, 
'b': 2012-04-16 0 
2012-04-17 1 
2012-04-18 2 
2012-04-19 3 
2012-04-20 4 
2012-04-21 5 
2012-04-22 6 
2012-04-23 7 
2012-04-24 8 
2012-04-25 9 
Freq: D, 
'c': 2012-04-16 0 
2012-04-17 1 
2012-04-18 2 
2012-04-19 3 
2012-04-20 4 
2012-04-21 5 
2012-04-22 6 
2012-04-23 7 
2012-04-24 8 
2012-04-25 9 
Freq: D} 

In [21]: df = pd.concat(data, axis=1, keys=['a', 'b', 'c']) 

In [22]: df 
Out[22]: 
      a b c 
2012-04-16 0 0 0 
2012-04-17 1 1 1 
2012-04-18 2 2 2 
2012-04-19 3 3 3 
2012-04-20 4 4 4 
2012-04-21 5 5 5 
2012-04-22 6 6 6 
2012-04-23 7 7 7 
2012-04-24 8 8 8 
2012-04-25 9 9 9 

In [23]: df2 = pd.concat([df, df], axis=1, keys=['group1', 'group2']) 

In [24]: df2 
Out[24]: 
      group1  group2  
       a b c  a b c 
2012-04-16  0 0 0  0 0 0 
2012-04-17  1 1 1  1 1 1 
2012-04-18  2 2 2  2 2 2 
2012-04-19  3 3 3  3 3 3 
2012-04-20  4 4 4  4 4 4 
2012-04-21  5 5 5  5 5 5 
2012-04-22  6 6 6  6 6 6 
2012-04-23  7 7 7  7 7 7 
2012-04-24  8 8 8  8 8 8 
2012-04-25  9 9 9  9 9 9 

Bạn có rồi:

In [25]: df2['group2'] 
Out[25]: 
      a b c 
2012-04-16 0 0 0 
2012-04-17 1 1 1 
2012-04-18 2 2 2 
2012-04-19 3 3 3 
2012-04-20 4 4 4 
2012-04-21 5 5 5 
2012-04-22 6 6 6 
2012-04-23 7 7 7 
2012-04-24 8 8 8 
2012-04-25 9 9 9 

hoặc thậm chí

In [27]: df2.xs('b', axis=1, level=1) 
Out[27]: 
      group1 group2 
2012-04-16  0  0 
2012-04-17  1  1 
2012-04-18  2  2 
2012-04-19  3  3 
2012-04-20  4  4 
2012-04-21  5  5 
2012-04-22  6  6 
2012-04-23  7  7 
2012-04-24  8  8 
2012-04-25  9  9 

Bạn có thể tùy tiện nhiều cấp độ:

In [29]: pd.concat([df2, df2], axis=1, keys=['tier1', 'tier2']) 
Out[29]: 
      tier1      tier2      
      group1  group2  group1  group2  
       a b c  a b c  a b c  a b c 
2012-04-16  0 0 0  0 0 0  0 0 0  0 0 0 
2012-04-17  1 1 1  1 1 1  1 1 1  1 1 1 
2012-04-18  2 2 2  2 2 2  2 2 2  2 2 2 
2012-04-19  3 3 3  3 3 3  3 3 3  3 3 3 
2012-04-20  4 4 4  4 4 4  4 4 4  4 4 4 
2012-04-21  5 5 5  5 5 5  5 5 5  5 5 5 
2012-04-22  6 6 6  6 6 6  6 6 6  6 6 6 
2012-04-23  7 7 7  7 7 7  7 7 7  7 7 7 
2012-04-24  8 8 8  8 8 8  8 8 8  8 8 8 
2012-04-25  9 9 9  9 9 9  9 9 9  9 9 9 
+0

Nice! Điều này có vẻ như nó có thể là những gì tôi cần - bây giờ để thực sự thử nó ra và xem. –

+0

Tôi có kế hoạch để có một đối tượng hoàn toàn N-chiều cuối cùng, nhưng nó đã không được hoàn toàn cần thiết trong rất nhiều trường hợp –

+0

OK - Tôi nghĩ rằng làm theo tất cả mọi thứ nhưng bước đầu tiên (tức là tôi nhận được nó một khi tôi có DataFrame ban đầu). Điều này có nghĩa là tôi sẽ cần phải lấy danh sách các đối tượng Series (trong cấu trúc dữ liệu cơ bản) và xây dựng một DataFrame, sử dụng một số phương thức kết nối ban đầu và sau đó đi qua và thực hiện chuỗi concatentations hoặc có cách tốt hơn để làm điều đó ? –

Các vấn đề liên quan