在进一步研究之前,有很多相关的答案 我要问的问题。据我所知,没有 以连贯的方式直接解决我的问题。
以下是我的数据示例:
Index API Measurement
0 5 1000
1 5 2000
2 5 30.1
3 10 12
4 12 0
5 1 3123.1
6 1 101.1
7 100 3
8 23 0
9 23 123212.1
这就是我想要做的。 我想-尽可能简单高效 找出重复API值的索引范围。
所需的输出:
API Index_RANGE
5 (0,2)
10 3
12 4
1 (5,6)
100 7
23 (8,9)
我该如何实现这一目标?
答案 0 :(得分:3)
如果您需要元组或单个数字,我将编写您自己的函数,并将其传递给.agg
。表单组查找'API'
变化的地方:
def Index_RANGE(x):
minx = x.index.min()
maxx = x.index.max()
if minx != maxx:
return (minx, maxx)
else:
return minx
(df.groupby((df.API != df.API.shift(1)).cumsum()).API.agg(['first', Index_RANGE])
.set_index('first').rename_axis('API'))
Index_RANGE
API
5 (0, 2)
10 3
12 4
1 (5, 6)
100 7
23 (8, 9)
答案 1 :(得分:1)
以下代码准确地产生了您的预期输出,但性能不佳;随着输入数据大小的增加,它会严重放慢速度(由于列表理解)。
# Assume all repeated API values are contiguous;
# if not, first sort df by API
grouped = (df.groupby('API', sort=False)['Index']
.agg(['first', 'last'])
.itertuples(index=False, name=None))
pd.Series([x if x[0] != x[1] else x[0] for x in grouped],
index=df.API.unique(), name='Index_RANGE')
5 (0, 2)
10 3
12 4
1 (5, 6)
100 7
23 (8, 9)
Name: Index_RANGE, dtype: object