Sorting 熊猫数据帧:计算每小时的值之和?
我是一名Python初学者,主要使用matlab。我的语法有点问题 我正在使用一个包含多个列的数据帧“df”。在df中,是一个以时间作为值字符串的列:df['Hour'],以及一个以值计数的列df['values']。我基本上想计算每个不同小时的“值”之和 这是我的方法。有人能给我一些建议,如何把这个基本的想法翻译成干净的东西吗?必须有一个更简单的方法来做到这一点 非常感谢你的帮助Sorting 熊猫数据帧:计算每小时的值之和?,sorting,pandas,sum,line,Sorting,Pandas,Sum,Line,我是一名Python初学者,主要使用matlab。我的语法有点问题 我正在使用一个包含多个列的数据帧“df”。在df中,是一个以时间作为值字符串的列:df['Hour'],以及一个以值计数的列df['values']。我基本上想计算每个不同小时的“值”之和 这是我的方法。有人能给我一些建议,如何把这个基本的想法翻译成干净的东西吗?必须有一个更简单的方法来做到这一点 非常感谢你的帮助 # first sort my dataframe by ascending hours df = df.sort
# 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
您可以使用:
一般来说,您可能希望避免使用
pandas
代码循环-您正在失去速度。您可以使用:
一般来说,您可能希望避免使用
pandas
代码循环-您正在失去速度。有几种方法可以做到这一点。有些方法比其他方法更快或更容易
方法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上求和。如果您有一个多索引
,这种方法将工作得更好
>>> df.set_index('Hour', inplace=True)
>>> %timeit df.groupby(level=0).sum()
100 loops, best of 3: 3.19 ms per loop
有几种方法可以做到这一点。有些方法比其他方法更快或更容易 方法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上求和。如果您有一个多索引
,这种方法将工作得更好
>>> df.set_index('Hour', inplace=True)
>>> %timeit df.groupby(level=0).sum()
100 loops, best of 3: 3.19 ms per loop