Pandas数据帧:计算每小时的值总和?

时间:2015-06-28 05:03:38

标签: sorting pandas sum line

我是Python的初学者,主要用于matlab。我在语法方面遇到了一些问题。

我正在使用几列的pandas数据帧“df”。在df中是一列,其中time为一串值:df ['Hour'],以及一个值为df ['values']的列。我基本上想要计算每个不同小时的'值'之和。

这是我的方法。有人可以就如何将这个基本想法转化为干净的东西给我建议吗?必须有一种更简单的方法来做到这一点!

非常感谢您的帮助!

# first sort my dataframe by ascending hours
df = df.sort(['Hour'],ascending=[1])

# initialize a new empty column in df, called "change"
df['change'] = np.zeros(len(df['Hour']))

# loop over df, finding all the indices where the hour changes (where "i" is not equal to "i-1"). I call this array of changes "A"
i = 0
for i in range(len(df)):
    A = numpy.where(df['Hour'][i] != df['Hour'][i-1]) 
    #if the index is the same any value of A, that means the Hour has changed
    if i == A:
    #assign to df['change'] the sum of df['values'] for the current hour (sum of values for hour = 0, then hour = 1, then hour = 2, etc).
        df['change'] = "df['values'].sum() where df['Hour'] is the same" #how can I write this?
i = i+1

2 个答案:

答案 0 :(得分:2)

您可以使用groupby+sum combination

middleware: function (connect) {<br>
        var middlewares = [];<br>
        middlewares.push(modRewrite([
          '!/assets|\\.html|\\.js|\\.css|\\woff|\\ttf|\\swf$ /index.html'
        ]));

        middlewares.push(connect.static('.tmp'));
        middlewares.push(connect().use(
          '/bower_components',
          connect.static('./bower_components')
        ));
        middlewares.push(connect.static(appConfig.app));

        //middlewares.push(require('grunt-connect-proxy/lib/utils').proxyRequest);
        return middlewares;
      }

一般情况下,您可能希望避免使用df.values.groupby(df.Hour).sum() 代码进行循环 - 您的速度会下降。

答案 1 :(得分:2)

有几种方法可以做到这一点。有些方法比其他方法更快或更容易。

方法1:groupby给出一个列名。如果您要分组的内容是列而不是索引,则这是最快的。

>>> %timeit df.values.groupby('Hour').sum()
1000 loops, best of 3: 1.35 ms per loop

方法2:groupbyHour。这是Ami的方法。如果您要分组的内容不在您要分组的DataFrame中,但在您的情况下会更慢。

>>> %timeit df.values.groupby(df.Hour).sum()
100 loops, best of 3: 6.95 ms per loop

方法3:将Hour列转换为索引,然后将sum转换为索引。只要想要求和的东西已经是指数,这是最快的方法。在你的情况下,我认为将Hour作为索引会简化很多事情,所以这就是我要使用的方法。

>>> df.set_index('Hour', inplace=True)
>>> %timeit df.sum()
1000 loops, best of 3: 744 µs per loop

方法4:将Hour列转换为索引上的索引groupby,然后对groupby求和。如果您有MultiIndex,这种方法会更好。

>>> df.set_index('Hour', inplace=True)
>>> %timeit df.groupby(level=0).sum()
100 loops, best of 3: 3.19 ms per loop