Python 熊猫:组内最大值和最小值之间的差异

Python 熊猫:组内最大值和最小值之间的差异,python,pandas,numpy,Python,Pandas,Numpy,给定一个如下所示的数据帧 GROUP VALUE 1 5 2 2 1 10 2 20 1 7 我想计算每组中最大值和最小值之间的差值。也就是说,结果应该是 GROUP DIFF 1 5 2 18 在熊猫身上做这件事的简单方法是什么 对于一个包含大约200万行和100万组的数据帧,在Pandas中执行此操作的快速方法是什么?您可以使用groupby()、min()和max(): groupby/agg通

给定一个如下所示的数据帧

GROUP VALUE
  1     5
  2     2
  1     10
  2     20
  1     7
我想计算每组中最大值和最小值之间的差值。也就是说,结果应该是

GROUP   DIFF
  1      5
  2      18
在熊猫身上做这件事的简单方法是什么

对于一个包含大约200万行和100万组的数据帧,在Pandas中执行此操作的快速方法是什么?

您可以使用
groupby()
min()
max()


groupby/agg
通常在利用内置聚合器(如
'max'
'min'
)时性能最佳。因此,要获得差值,首先计算
max
min
,然后减去:

import pandas as pd
df = pd.DataFrame({'GROUP': [1, 2, 1, 2, 1], 'VALUE': [5, 2, 10, 20, 7]})
result = df.groupby('GROUP')['VALUE'].agg(['max','min'])
result['diff'] = result['max']-result['min']
print(result[['diff']])
屈服

       diff
GROUP      
1         5
2        18

使用@unutbu的
df

每次计时
unutbu的解决方案最适用于大型数据集

import pandas as pd
import numpy as np

df = pd.DataFrame({'GROUP': [1, 2, 1, 2, 1], 'VALUE': [5, 2, 10, 20, 7]})

df.groupby('GROUP')['VALUE'].agg(np.ptp)

GROUP
1     5
2    18
Name: VALUE, dtype: int64

返回数组的范围


定时
小型
df

df

df=pd.DataFrame(dict(GROUP=np.arange(1000000)%100,VALUE=np.rand.rand(1000000))

df

许多组
df=pd.DataFrame(dict(GROUP=np.arange(1000000)%10000,VALUE=np.rand.rand(1000000))


很长一段时间以来,我一直在想为什么熊猫没有射程法。很高兴知道numpy有,我是不是遗漏了什么?似乎np.ptp方法仅在“小df”情况下最快。在其他情况下,.agg([max],[min]).diff(axis=1)方法的性能明显更好。@Heavybreating您没有错过任何东西。我提供了一个替代解决方案,但同时验证了另一个海报的解决方案。老实说,我很惊讶这比
agg(np.ptp)
好多少,尤其是在大量的组中!如果我想对几列中的每一列,而不仅仅是一列(“值”)执行此操作,该怎么办?@CPBL:如果您想为
df
(每个
)的所有列找到
min
max
,那么只需删除
['VALUE']
。也就是说,使用
df.groupby('GROUP').agg(['max','min'])
。如果您希望为某些但不是所有列查找每个
组的
min
max
,请首先限制
df
df[['GROUP','VALUE1','VALUE2']].groupby('GROUP').agg(['max','min')
。谢谢。是否有一条线来获得差异?(不使用np.ptp,因为我实际上需要agg(['last','first'])@CPBL的符号差:您可以使用
df.groupby('GROUP').agg(['last','first']).stack(level=0.diff(axis=1)。取消堆栈(-1)['last']
。但我觉得这并不特别可读。可能使用3行代码
result=df.groupby('GROUP').agg(['last','first'])
result=result.reorder_levels([1,0],axis=1)
result['last']-result['first']
更好。
import pandas as pd
import numpy as np

df = pd.DataFrame({'GROUP': [1, 2, 1, 2, 1], 'VALUE': [5, 2, 10, 20, 7]})

df.groupby('GROUP')['VALUE'].agg(np.ptp)

GROUP
1     5
2    18
Name: VALUE, dtype: int64