我是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
答案 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:groupby
值Hour
。这是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