Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting 熊猫数据帧:计算每小时的值之和?_Sorting_Pandas_Sum_Line - Fatal编程技术网

Sorting 熊猫数据帧:计算每小时的值之和?

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

我是一名Python初学者,主要使用matlab。我的语法有点问题

我正在使用一个包含多个列的数据帧“df”。在df中,是一个以时间作为值字符串的列: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
您可以使用:


一般来说,您可能希望避免使用
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