熊猫:群体中最大值和最小值之间的差异

Dav*_*vid 29 python numpy pandas

给定一个看起来像这样的数据框

GROUP VALUE
  1     5
  2     2
  1     10
  2     20
  1     7
Run Code Online (Sandbox Code Playgroud)

我想计算每组中最大值和最小值之间的差异.也就是说,结果应该是

GROUP   DIFF
  1      5
  2      18
Run Code Online (Sandbox Code Playgroud)

在熊猫中这样做的简单方法是什么?

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

piR*_*red 32

使用@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
Run Code Online (Sandbox Code Playgroud)

np.ptpdocs返回数组的范围


时间
很小df

在此输入图像描述

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

在此输入图像描述

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

在此输入图像描述

  • 很长一段时间以来,我一直在想为什么大熊猫没有范围方法.很高兴知道numpy有它. (2认同)
  • 我在这里错过了什么吗?似乎np.ptp方法在"小df"情况下只是最快的.在其他情况下,.agg([max],[min]).diff(axis = 1)方法表现得更好. (2认同)

unu*_*tbu 20

groupby/agg当您利用内置聚合器(如'max'和)时,通常表现最佳'min'.因此获得的区别,首先计算maxmin,然后减去:

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']])
Run Code Online (Sandbox Code Playgroud)

产量

       diff
GROUP      
1         5
2        18
Run Code Online (Sandbox Code Playgroud)

  • 老实说,我很惊讶这比 `agg(np.ptp)` 好得多,尤其是在大量组中! (2认同)

ASG*_*SGM 9

您可以使用groupby(),min()以及max():

df.groupby('GROUP')['VALUE'].apply(lambda g: g.max() - g.min())
Run Code Online (Sandbox Code Playgroud)