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