2015-02-24 61 views
1

我有一系列具有相同結構的數據框,代表一年中每個小時的模擬結果。每個模擬包含一系列座標(x,y)的結果。熊貓多指數從數據框系列

每個數據幀都是從csv文件導入的,該文件只在文件名中包含時間信息。例如:

results_YYMMDDHH.csv 

包含這樣

x y   a   b 
0.0 0.0 0.318705 -0.871259 
0.1 0.0 -0.937012 0.704270 
0.1 0.1 -0.032225 -1.939544 
0.0 0.1 -1.874781 -0.033073 

數據我想創建單個MultiIndexed數據幀(0電平是時間和級別1是(X,Y)),讓我來執行各種像使用重採樣或groupby方法的這些數據幀之間的平均值,總和,最大值等操作。對於每一個時間步長

產生的數據幀應該是這個樣子

     x y   a   b 
2010-01-01 10:00  0.0 0.0 0.318705 -0.871259 
        0.1 0.0 -0.934512 0.745270 
        0.1 0.1 -0.0334525 -1.963544 
        0.0 0.1 -1.835781 -0.067573 

2010-01-01 11:00  0.0 0.0 0.318705 -0.871259 
        0.1 0.0 -0.923012 0.745670 
        0.1 0.1 -0.035225 -1.963544 
        0.0 0.1 -1.835781 -0.067573 
................. 
................. 
2010-12-01 10:00  0.0 0.0 0.318705 -0.871259 
        0.1 0.0 -0.923012 0.723270 
        0.1 0.1 -0.034225 -1.963234 
        0.0 0.1 -1.835781 -0.067233 

你可以想像這在今年的每個小時。現在我想能夠計算全年的平均值或六月份的平均值。 還有其他任何功能,如高於某個閾值的小時數或最小值與最大值之間的小時數。請記住,結果應該在這些操作的任何一個DataFrame中。例如,每月平均值應該看起來像

   x y  a  b 
2010-01  0.0 0.0 0.45 -0.13 
2010-02  0.1 0.0 0.55 -0.87 
2010-03  0.1 0.1 0.24 -0.83 
2010-04  0.0 0.1 0.11 -0.87 

如何構建此多索引數據框?我把它描繪成一個數據幀的時間序列。

+0

爲什麼你認爲這需要multiindexed?它似乎只需要一個索引即文件的時間戳。你想要的輸出fwiw是單索引的。 – acushner 2015-02-26 19:16:26

+1

你有一點。道歉,我一直在看這些數據很長時間,我覺得其他人都知道他們!我已經進一步澄清。 – Rojj 2015-02-26 19:40:24

回答

1

鑑於更充分解釋的問題,以下是與我較早的答案不同的答案。遍歷文件並將它們讀入熊貓,解析日期並將其添加到數據框中,然後使用​​創建多指數。一旦你得到了你所有的dataframes,使用pd.concat將它們結合起來:

dataframes = [] 
for filename in filenames: 
    df = pd.read_csv(filename) 
    df["datetime"] = datetime.datetime.strptime(filename[8:18], "%Y%m%d%H") 
    dataframes.append(df.set_index(["datetime","x", "y"])) 

combined_df = pd.concat(dataframes) 
3

我會做一個面板,然後使用to_frame()其轉換成multiindexed數據幀:

In [29]: df1 = pd.DataFrame(dict(a=[0.318705,-0.937012,-0.032225,-1.874781], b=[-0.871259,0.704270,-1.939544,-0.033073])) 

In [30]: df2 = pd.DataFrame(dict(a=[0.318705,-0.937012,-0.032225,-1.874781], b=[-0.871259,0.704270,-1.939544,-0.033073])) 

In [31]: df1 
Out[31]: 
      a   b 
0 0.318705 -0.871259 
1 -0.937012 0.704270 
2 -0.032225 -1.939544 
3 -1.874781 -0.033073 

In [32]: data = {datetime.datetime(2010,6,21,10,0,0): df1, datetime.datetime(2010,6,22,10,0,0): df2} 

In [33]: p = pd.Panel(data) 

In [34]: p.to_frame() 
Out[34]: 
      2010-06-21 10:00:00 2010-06-22 10:00:00 
major minor 
0  a     0.318705    0.318705 
     b    -0.871259   -0.871259 
1  a    -0.937012   -0.937012 
     b     0.704270    0.704270 
2  a    -0.032225   -0.032225 
     b    -1.939544   -1.939544 
3  a    -1.874781   -1.874781 
     b    -0.033073   -0.033073 

根據您想如何看待你的數據,你可以使用swapaxes重新安排它:

In [35]: p.swapaxes("major", "items").to_frame() 
Out[35]: 
            0   1   2   3 
major    minor 
2010-06-21 10:00:00 a  0.318705 -0.937012 -0.032225 -1.874781 
        b  -0.871259 0.704270 -1.939544 -0.033073 
2010-06-22 10:00:00 a  0.318705 -0.937012 -0.032225 -1.874781 
        b  -0.871259 0.704270 -1.939544 -0.033073 
+0

謝謝布萊恩,但它看起來不像我的樣本,是嗎? – Rojj 2015-02-25 12:35:04

+1

目前還不清楚您的示例是您的輸入還是您想要獲得的輸出。給兩者並指定哪一個是有幫助的。 – 2015-02-25 20:47:26

+0

我已重新編輯該問題。希望這個澄清更好 – Rojj 2015-02-26 18:45:12