2015-02-24 78 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