Python:运行另一列的最大值?

Python:运行另一列的最大值?,python,numpy,pandas,max,Python,Numpy,Pandas,Max,我有一个这样的数据框,它随时间跟踪某些项目(ID)的值: mytime=np.tile( np.arange(0,10) , 2 ) myids=np.repeat( [123,456], [10,10] ) myvalues=np.random.random_integers(20,30,10*2) df=pd.DataFrame() df['myids']=myids df['mytime']=mytime df['myvalues']=myvalues +-------+-----

我有一个这样的数据框,它随时间跟踪某些项目(ID)的值:

mytime=np.tile( np.arange(0,10) , 2 )
myids=np.repeat( [123,456], [10,10] )
myvalues=np.random.random_integers(20,30,10*2)

df=pd.DataFrame()
df['myids']=myids
df['mytime']=mytime
df['myvalues']=myvalues



+-------+--------+----------+--+--+
| myids | mytime | myvalues |  |  |
+-------+--------+----------+--+--+
| 123   | 0      | 29       |  |  |
+-------+--------+----------+--+--+
| 123   | 1      | 23       |  |  |
+-------+--------+----------+--+--+
| 123   | 2      | 26       |  |  |
+-------+--------+----------+--+--+
| 123   | 3      | 24       |  |  |
+-------+--------+----------+--+--+
| 123   | 4      | 25       |  |  |
+-------+--------+----------+--+--+
| 123   | 5      | 29       |  |  |
+-------+--------+----------+--+--+
| 123   | 6      | 28       |  |  |
+-------+--------+----------+--+--+
| 123   | 7      | 21       |  |  |
+-------+--------+----------+--+--+
| 123   | 8      | 20       |  |  |
+-------+--------+----------+--+--+
| 123   | 9      | 26       |  |  |
+-------+--------+----------+--+--+
| 456   | 0      | 26       |  |  |
+-------+--------+----------+--+--+
| 456   | 1      | 24       |  |  |
+-------+--------+----------+--+--+
| 456   | 2      | 20       |  |  |
+-------+--------+----------+--+--+
| 456   | 3      | 26       |  |  |
+-------+--------+----------+--+--+
| 456   | 4      | 29       |  |  |
+-------+--------+----------+--+--+
| 456   | 5      | 29       |  |  |
+-------+--------+----------+--+--+
| 456   | 6      | 24       |  |  |
+-------+--------+----------+--+--+
| 456   | 7      | 21       |  |  |
+-------+--------+----------+--+--+
| 456   | 8      | 27       |  |  |
+-------+--------+----------+--+--+
| 456   | 9      | 29       |  |  |
+-------+--------+----------+--+--+
我需要计算每个id的运行最大值

np.maximum.accumulate()
将计算运行的最大值,而不考虑id,而我需要类似的计算,但每次id更改时都会重置。我可以想出一个简单的脚本在numba中实现它(我有非常大的数组,非矢量化的非numba代码会很慢),但是有更简单的方法吗

仅使用两个值,我就可以运行:

df['running max']= np.hstack((  np.maximum.accumulate(df[ df['myids']==123 ]['myvalues']) , np.maximum.accumulate(df[ df['myids']==456 ]['myvalues']) )  )
但这是不可行的,因为有很多很多价值观


谢谢

看来确实不太难

byid = df.groupby('myid')
rmax = byid['myvalues].cummax()
for k, indices in byid.indices.items():
    print 'myid = %s' % k
    print 'running max = %s' % rmax[indices]
我以前(几乎)没有熊猫,但使用
ipython
作为探索工具,我能够找到解决方案。我建议使用
ipython
来探索大型复杂的库


p、 关于我之前的评论:不需要axis=

这似乎确实不太难

byid = df.groupby('myid')
rmax = byid['myvalues].cummax()
for k, indices in byid.indices.items():
    print 'myid = %s' % k
    print 'running max = %s' % rmax[indices]
我以前(几乎)没有熊猫,但使用
ipython
作为探索工具,我能够找到解决方案。我建议使用
ipython
来探索大型复杂的库


p、 这是我之前的评论:不需要axis=

给你。假设我的时间已排序

mytime=np.tile( np.arange(0,10) , 2 )
myids=np.repeat( [123,456], [10,10] )
myvalues=np.random.random_integers(20,30,10*2)

df=pd.DataFrame()
df['myids']=myids
df['mytime']=mytime
df['myvalues']=myvalues

groups = df.groupby('myids')
df['run_max_group'] = groups['myvalues'].transform(np.maximum.accumulate)
输出

    myids  mytime  myvalues  run_max_group
0     123       0        27             27
1     123       1        21             27
2     123       2        24             27
3     123       3        25             27
4     123       4        22             27
5     123       5        20             27
6     123       6        20             27
7     123       7        30             30
8     123       8        24             30
9     123       9        22             30
10    456       0        29             29
11    456       1        23             29
12    456       2        30             30
13    456       3        28             30
14    456       4        26             30
15    456       5        25             30
16    456       6        28             30
17    456       7        27             30
18    456       8        20             30
19    456       9        24             30

给你。假设我的时间已排序

mytime=np.tile( np.arange(0,10) , 2 )
myids=np.repeat( [123,456], [10,10] )
myvalues=np.random.random_integers(20,30,10*2)

df=pd.DataFrame()
df['myids']=myids
df['mytime']=mytime
df['myvalues']=myvalues

groups = df.groupby('myids')
df['run_max_group'] = groups['myvalues'].transform(np.maximum.accumulate)
输出

    myids  mytime  myvalues  run_max_group
0     123       0        27             27
1     123       1        21             27
2     123       2        24             27
3     123       3        25             27
4     123       4        22             27
5     123       5        20             27
6     123       6        20             27
7     123       7        30             30
8     123       8        24             30
9     123       9        22             30
10    456       0        29             29
11    456       1        23             29
12    456       2        30             30
13    456       3        28             30
14    456       4        26             30
15    456       5        25             30
16    456       6        28             30
17    456       7        27             30
18    456       8        20             30
19    456       9        24             30

-你可以写并接受你自己的答案…我按MyID分组,那么,具体是什么?我确信这只是因为我太胖了,但我来自SQL背景,我真的很难了解pandas(而且,糟糕的文档也没有帮助).
df.groupby('myid')['myvalues'].cummax()
非常接近,但我不知道如何进一步
.cummax()
接受一个
axis=
参数,但作为一个参数。我不知道如何使用它(无论如何,它不完全是numpy
axis=
)-您可以编写并接受自己的答案…我按MyID分组,那么,具体是什么?我确信这只是因为我太胖了,但我来自SQL背景,我真的很难了解pandas(而且,糟糕的文档也没有帮助).
df.groupby('myid')['myvalues'].cummax()
非常接近,但我不知道如何进一步
.cummax()
接受一个
axis=
参数,但作为一个参数。我不知道如何使用它(无论如何,它不完全是一个numpy
axis=
),transform()在任何地方都有文档记录吗?这个链接:没有显示任何内容。这是另一个链接:说了些什么,但不是一句话。我不熟悉文档。我可以试着解释一下。。。如果您知道聚合函数是如何工作的,那么您就知道转换是如何工作的。它只是从聚合中扩展结果值以匹配组的大小。假设a组的值为[1,2,3],b组的值为[3,4,5]。如果我做groups.aggregate(max),我将得到a=3和b=5。groups.transform将给我a=[3,3,3]和b=[5,5,5]。这使得修改或添加现有数据帧变得更加容易。transform()是否在任何地方都有文档记录?这个链接:没有显示任何内容。这是另一个链接:说了些什么,但不是一句话。我不熟悉文档。我可以试着解释一下。。。如果您知道聚合函数是如何工作的,那么您就知道转换是如何工作的。它只是从聚合中扩展结果值以匹配组的大小。假设a组的值为[1,2,3],b组的值为[3,4,5]。如果我做groups.aggregate(max),我将得到a=3和b=5。groups.transform将给我a=[3,3,3]和b=[5,5,5]。这使得修改或添加现有数据帧变得更加容易。