2013-06-08 37 views
5

Tôi có nhiều khung dữ liệu với giá cổ phiếu mà tôi muốn căn chỉnh vào một khung dữ liệu duy nhất chỉ chứa giá đóng cho tất cả các cổ phiếu.Hợp nhất nhiều khung dữ liệu chưa được căn chỉnh vào khung dữ liệu đơn lẻ

Tôi hy vọng tất cả các ngày từ tất cả các khung dữ liệu sẽ có mặt trong cột ngày (chỉ mục) và "NA" trong trường hợp không có giá đóng cho cổ phiếu vào ngày đó.

Ví dụ với hai dữ liệu khung (df1 và df2):

In [5]: df1 
Out[5]: 
      Open High Low Close 
Date1 
2012-01-05 22.00 22.66 23.11 24.04 
2012-01-04 24.04 23.80 23.08 22.16 
2012-01-03 22.16 21.27 20.42 21.24 
2012-01-01 21.24 22.30 22.52 22.30 

In [7]: df2 
Out[7]: 
      Open High Low Close 
Date1 
2012-01-07 23.00 21.66 25.11 21.04 
2012-01-06 22.00 22.66 23.11 24.04 
2012-01-04 24.04 23.80 23.08 22.16 
2012-01-02 22.16 21.27 20.42 21.24 
2012-01-01 21.24 22.30 22.52 22.30 

Bây giờ tôi có thể làm

In [8]: frame=pd.DataFrame({"df1.Close":df1["Close"], "df2.Close":df2["Close"]}) 

và kết quả là như mong đợi:

In [9]: frame 
Out[9]: 
      df1.Close df2.Close 
Date1 
2012-01-01  22.30  22.30 
2012-01-02  NaN  21.24 
2012-01-03  21.24  NaN 
2012-01-04  22.16  22.16 
2012-01-05  24.04  NaN 
2012-01-06  NaN  24.04 
2012-01-07  NaN  21.04 

Làm thế nào sẽ Tôi cần phải thay đổi mã của tôi để làm tương tự cho một số động của khung dữ liệu? Ngay bây giờ, tôi có 8 khung dữ liệu tôi cần căn chỉnh theo cách này. Có cách nào lặp lại thông qua danh sách các khung dữ liệu và sắp xếp chúng như trên không - thay vì buộc các tên khung dữ liệu theo cách thủ công (giống như df [0] để df [7] nói theo nghĩa bóng]?

Cảm ơn bạn trước và kính thư! Dirk

Trả lời

4

Nếu bạn có dữ liệu khung trong một danh sách (các đối tượng dữ liệu khung hình thực tế, ý tôi là, không phải tên của họ) mà trông giống như sau:

dflist = [df1, df2, df3, df4, df5, df6, df7, df8] 

sau đó đoạn mã sau nên làm những gì có vẻ như bạn đang tìm kiếm:

frame = {} 
for idx, df in enumerate(dflist): 
    n = idx+1 # Since lists are 0-indexed 
    name = "df{0:d}.Close".format(n) 
    close = df["Close"] 
    frame[name] = close 

Bạn có thể làm điều này gọn nhẹ hơn với đọc hiểu, nhưng trong ví dụ mã, tôi thích đánh vần một cách rõ ràng hơn để dễ hiểu. Để tham khảo, việc đọc dict sẽ trông giống như sau:

{"df{0:d}.Close".format(idx+1): df["Close"] for idx, df in enumerate(dflist)} 
+0

Rất tuyệt, cảm ơn rất nhiều! Với ví dụ đó, tôi nửa đường ở đó. Bây giờ làm thế nào tôi sẽ làm cho "dflist" năng động? Tôi sẽ không biết trước bao nhiêu khung dữ liệu tôi sẽ cần - vì vậy tôi đoán tôi đang tìm cách tạo một số khung dữ liệu động và sau đó sử dụng mã của bạn. Cám ơn rất nhiều về sự giúp đỡ của bạn! – user1653205

+0

Chỉ cần sử dụng các phương thức thao tác danh sách chuẩn như 'append()' - ví dụ như khi bạn nhận được một khung dữ liệu mới, hãy làm một cái gì đó như 'dflist.append (new_df)'. – rmunn

+0

Tôi nghĩ tôi đang tiến gần hơn. Bây giờ tôi đã tải các dataframes vào một dict trong đó khóa là ticker của cổ phiếu và giá trị là dataframe với các dấu ngoặc kép OHLC cho chứng khoán. Bây giờ tôi có một dict với 8 cặp khóa/giá trị. Câu hỏi còn lại là: Làm cách nào để tôi tham gia các khung dữ liệu thành một bằng cách lặp lại thông qua dict của tôi? – user1653205

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