2014-10-14 21 views
5

Điều này đã khiến cho cuộc sống của tôi bị cấm trong vài ngày qua. Tôi có rất nhiều Pandas Dataframes chứa dữ liệu chuỗi thời gian với tần số không đều. Tôi cố gắng sắp xếp chúng thành một khung dữ liệu duy nhất.Pandas sắp xếp nhiều khung dữ liệu với chỉ mục TimeStamp

Dưới đây là một số mã, với dataframes đại diện, df1, df2, và df3 (Tôi thực sự có n = 5, và sẽ đánh giá cao một giải pháp mà sẽ làm việc cho tất cả n>2):

# df1, df2, df3 are given at the bottom 
import pandas as pd 
import datetime 

# I can align df1 to df2 easily 
df1aligned, df2aligned = df1.align(df2) 
# And then concatenate into a single dataframe 
combined_1_n_2 = pd.concat([df1aligned, df2aligned], axis =1) 
# Since I don't know any better, I then try to align df3 to combined_1_n_2 manually: 
combined_1_n_2.align(df3) 
error: Reindexing only valid with uniquely valued Index objects 

Tôi có một ý tưởng tại sao tôi nhận được lỗi này, vì vậy tôi thoát khỏi các chỉ số trùng lặp trong combined_1_n_2 và thử lại:

combined_1_n_2 = combined_1_n_2.groupby(combined_1_n_2.index).first() 
combined_1_n_2.align(df3) # But stll get the same error 
error: Reindexing only valid with uniquely valued Index objects 

tại sao tôi nhận được lỗi này? Ngay cả khi điều này làm việc, nó là hoàn toàn bằng tay và xấu xí. Làm thế nào tôi có thể sắp xếp> 2 chuỗi thời gian và kết hợp chúng trong một khung dữ liệu duy nhất?

dữ liệu:

df1 = pd.DataFrame({'price' : [62.1250,62.2500,62.2375,61.9250,61.9125 ]}, 
        index = [pd.DatetimeIndex([datetime.datetime.strptime(s, '%Y-%m-%d %H:%M:%S.%f')])[0] 
        for s in ['2008-06-01 06:03:59.614000', '2008-06-01 06:03:59.692000', 
        '2008-06-01 06:15:42.004000', '2008-06-01 06:15:42.083000','2008-06-01 06:17:01.654000' ] ]) 

df2 = pd.DataFrame({'price': [241.0625, 241.5000, 241.3750, 241.2500, 241.3750 ]}, 
        index = [pd.DatetimeIndex([datetime.datetime.strptime(s, '%Y-%m-%d %H:%M:%S.%f')])[0] 
        for s in ['2008-06-01 06:13:34.524000', '2008-06-01 06:13:34.602000', 
        '2008-06-01 06:15:05.399000', '2008-06-01 06:15:05.399000','2008-06-01 06:15:42.082000' ] ]) 

df3 = pd.DataFrame({'price': [67.656, 67.875, 67.8125, 67.75, 67.6875 ]}, 
        index = [pd.DatetimeIndex([datetime.datetime.strptime(s, '%Y-%m-%d %H:%M:%S.%f')])[0] 
        for s in ['2008-06-01 06:03:52.281000', '2008-06-01 06:03:52.359000', 
        '2008-06-01 06:13:34.848000', '2008-06-01 06:13:34.926000','2008-06-01 06:15:05.321000' ] ]) 

Trả lời

3

lỗi cụ thể của bạn là do các tên cột của combined_1_n_2 có bản sao (cả hai cột sẽ được đặt tên là 'giá'). Bạn có thể đổi tên các cột và sắp xếp thứ hai sẽ hoạt động.

Một cách khác là kết nối nhà điều hành join, kết hợp các khung trên chỉ mục, như dưới đây.

In [23]: df1.join(df2, how='outer', rsuffix='_1').join(df3, how='outer', rsuffix='_2') 
Out[23]: 
           price price_1 price_2 
2008-06-01 06:03:52.281000  NaN  NaN 67.6560 
2008-06-01 06:03:52.359000  NaN  NaN 67.8750 
2008-06-01 06:03:59.614000 62.1250  NaN  NaN 
2008-06-01 06:03:59.692000 62.2500  NaN  NaN 
2008-06-01 06:13:34.524000  NaN 241.0625  NaN 
2008-06-01 06:13:34.602000  NaN 241.5000  NaN 
2008-06-01 06:13:34.848000  NaN  NaN 67.8125 
2008-06-01 06:13:34.926000  NaN  NaN 67.7500 
2008-06-01 06:15:05.321000  NaN  NaN 67.6875 
2008-06-01 06:15:05.399000  NaN 241.3750  NaN 
2008-06-01 06:15:05.399000  NaN 241.2500  NaN 
2008-06-01 06:15:42.004000 62.2375  NaN  NaN 
2008-06-01 06:15:42.082000  NaN 241.3750  NaN 
2008-06-01 06:15:42.083000 61.9250  NaN  NaN 
2008-06-01 06:17:01.654000 61.9125  NaN  NaN 
+0

Cảm ơn bạn, điều đó thật đáng ngạc nhiên; do đó, 'align()' là không cần thiết nếu tôi làm chuỗi tham gia? – Rhubarb

+0

Đúng, 'join' xử lý logic chỉ mục cho bạn. – chrisb

+0

Cảm ơn bạn, vì tò mò: bạn có thể chỉ mô tả ngắn gọn về thời điểm một người có thể cần sử dụng align() sau đó không? Bởi vì với tôi có vẻ như join() xử lý cả sự liên kết và ghép nối trong một lần. – Rhubarb

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