Python:运行另一列的最大值?
我有一个这样的数据框,它随时间跟踪某些项目(ID)的值: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 +-------+-----
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=
参数,但作为一个参数。我不知道如何使用它(无论如何,它不完全是numpyaxis=
)-您可以编写并接受自己的答案…我按MyID分组,那么,具体是什么?我确信这只是因为我太胖了,但我来自SQL背景,我真的很难了解pandas(而且,糟糕的文档也没有帮助).df.groupby('myid')['myvalues'].cummax()
非常接近,但我不知道如何进一步.cummax()
接受一个axis=
参数,但作为一个参数。我不知道如何使用它(无论如何,它不完全是一个numpyaxis=
),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]。这使得修改或添加现有数据帧变得更加容易。