相关文章推荐
乖乖的冲锋衣  ·  查询历史记录 - Azure ...·  11 月前    · 
愉快的香槟  ·  90%的ChatGPT功能?| ...·  1 年前    · 
沉稳的炒饭  ·  浅析AndroidStudio3.0最新 ...·  1 年前    · 
想表白的烤土司  ·  elementUI ...·  1 年前    · 
追风的凳子  ·  教学工作·  1 年前    · 

Pandas - 如何进行groupby,计算第一行和最后一行的差值,计算最大值,并在原始框架中选择相应的组。

1 人关注

我有一个Pandas数据框架,有两列我感兴趣的内容。一个分类标签和一个时间戳。据推测,我想做的事情也适用于有序的数字数据。该数据框架已经按时间戳升序排序了。我想找出时间跨度最长的标签,只选择原始数据框中与之相关的值。

我已经尝试按标签对df进行分组,计算差值并成功地选择了最大值(最长的时间窗口),然而我很难找到一个表达式来使用这些信息选择原始df中的相应数值。

考虑一下这个有数值的例子。

d = {'cat': ['A','A','A','A','A','A','B','B','B','B','C','C','C','C','C','C','C'],
     'val': [1,3,5,6,8,9,0,5,10,20,4,5,6,7,8,9,10]}
df = pd.DataFrame(data = d)

在这里,我期待着与df.loc[df.cat == 'B']相当的东西,因为B在所有类别中具有最大的差异。

df.groupby('cat').val.apply(lambda x: x.max() - x.min()).max()

给我提供了正确的差异,但我不知道如何用它来选择原始df中的正确类别。

python
pandas
group-by
pandas-groupby
sariq
sariq
发布于 2021-05-31
1 个回答
Mustafa Aydın
Mustafa Aydın
发布于 2021-05-31
已采纳
0 人赞同

你可以去找 idxmax 以得到组内产生最大峰-峰值的类别( np.ptp 做最大减去最小)。然后你可以像你说的那样用 loc 进行索引,或者 query :

>>> max_cat = df.groupby("cat").val.apply(np.ptp).idxmax()
>>> max_cat
>>> df.query("cat == @max_cat")  # or df.loc[df.cat == max_cat]
  cat  val