我有一个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中选择正确的类别。
您可以使用idxmax
来获取组内产生最大峰间值的类别(np.ptp
为最大值减去最小值(。然后你可以按照你说的用loc
或query
:进行索引
>>> max_cat = df.groupby("cat").val.apply(np.ptp).idxmax()
>>> max_cat
"B"
>>> df.query("cat == @max_cat") # or df.loc[df.cat == max_cat]
cat val
6 B 0
7 B 5
8 B 10
9 B 20