Pandas multiindex来自一系列数据帧

时间:2015-02-24 18:50:56

标签: python pandas dataframe multi-index

我有一系列具有相同结构的数据框,代表一年中每个小时的模拟结果。每个模拟都包含一系列坐标(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 Dataframe(级别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

你可以想象一年中的每个小时。我现在想能够计算出全年的平均值或6月份的平均值。 还有任何其他功能,例如高于特定阈值的小时数或最小值和最大值之间的小时数。请记住,结果应该是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

如何构建此MultiIndexed数据框?我认为这就像数据帧的时间序列。

2 个答案:

答案 0 :(得分:3)

我会创建一个Panel,然后使用to_frame()将其转换为多索引的DataFrame:

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

答案 1 :(得分:1)

根据更全面解释的问题,这是我之前的答案。迭代文件并将其读入pandas,解析日期并将其添加到数据框中,然后使用set_index创建多索引。获得所有数据帧后,使用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)