使用pandas

时间:2015-08-24 11:16:53

标签: python pandas dataframe

我有一个3行x 96列数据帧。我试图计算每12个数据点的索引(row1:96)下面两行的平均值。这是我的数据框:

 Run 1       Run 2      Run 3       Run 4       Run 5       Run 6  \
0  1461274.92  1458079.44  1456807.1  1459216.08  1458643.24  1457145.19   
1   478167.44   479528.72  480316.08   475569.52   472989.01   476054.89   
2      ------      ------     ------      ------      ------      ------   

    Run 7       Run 8       Run 9      Run 10     ...          Run 87  \
0  1458117.08  1455184.82  1455768.69  1454738.07     ...      1441822.45   
1   473630.89   476282.93   475530.87   474200.22     ...        468525.2   
2      ------      ------      ------      ------     ...          ------   

   Run 88      Run 89      Run 90      Run 91      Run 92      Run 93  \
0  1445339.53  1461050.97  1446849.43  1438870.43  1431275.76  1430781.28   
1    460076.8   473263.06   455885.07   475245.64   483875.35   487065.25   
2      ------      ------      ------      ------      ------      ------   

   Run 94      Run 95      Run 96  
0  1436007.32  1435238.23  1444300.51  
1   474328.87   475789.12   458681.11  
2      ------      ------      ------  

[3 rows x 96 columns]

目前我正在尝试使用df.irow(0)来选择行索引0中的所有数据。

类似于:

selection = np.arange(0,13)

for i in selection:
    new_df = pd.DataFrame()
    data = df.irow(0)

    ........

然后我迷路了

我只是不知道如何将此范围与数据框链接,以计算每列中每12个数据点的平均值。

总而言之,我想要每列中每12次运行的平均值。所以,我应该得到一个单独的数据帧,平均值为2 * 8(96/12)。 任何想法?

感谢。

1 个答案:

答案 0 :(得分:1)

最好尽可能尝试使用pandas方法,而不是遍历行。 DataFrame的iloc方法对于提取任意数量的行非常有用。

以下示例显示如何在双列DataFrame中执行所需操作。相同的技术将独立于列数工作:

In [14]: df = pd.DataFrame({"x": [1, 2, "-"], "y": [3, 4, "-"]})

In [15]: df
Out[15]:
   x  y
0  1  3
1  2  4
2  -  -

In [16]: df.iloc[2] = df.iloc[0:2].sum()

In [17]: df
Out[17]:
   x  y
0  1  3
1  2  4
2  3  7

但是,在你的情况下,你想要在df.iloc [2]中对每组八个单元格求和,所以你最好简单地用语句

来得到求和表达式的结果。
ds = df.iloc[0:2].sum()

与您的数据一起将具有

形式
col1    0
col2    1
col3    2
col4    3
   ...
col93  92
col94  93
col95  94
col96  95

(这些数字具有代表性,您显然会看到您的列数总和)。然后,您可以使用

将其转换为12x8矩阵
ds.values.reshape(12, 8)

,其值为

array([[ 0,  1,  2,  3,  4,  5,  6,  7],
   [ 8,  9, 10, 11, 12, 13, 14, 15],
   [16, 17, 18, 19, 20, 21, 22, 23],
   [24, 25, 26, 27, 28, 29, 30, 31],
   [32, 33, 34, 35, 36, 37, 38, 39],
   [40, 41, 42, 43, 44, 45, 46, 47],
   [48, 49, 50, 51, 52, 53, 54, 55],
   [56, 57, 58, 59, 60, 61, 62, 63],
   [64, 65, 66, 67, 68, 69, 70, 71],
   [72, 73, 74, 75, 76, 77, 78, 79],
   [80, 81, 82, 83, 84, 85, 86, 87],
   [88, 89, 90, 91, 92, 93, 94, 95]])

但总结这个数组会给你所有元素的总和,所以改为用

创建另一个DataFrame
rs = pd.DataFrame(ds.values.reshape(12, 8))

然后总结一下:

rs.sum()

0    528
1    540
2    552
3    564
4    576
5    588
6    600
7    612
dtype: int64

您可能会在实践中发现,首先简单地创建两个12x8矩阵更容易,您可以在创建数据帧之前将它们相加,然后可以求和。很大程度上取决于您如何阅读数据。