评估Pandas数据框中相同列值的行/索引范围

时间:2019-02-23 19:09:46

标签: python pandas dataframe

在进一步研究之前,有很多相关的答案 我要问的问题。据我所知,没有 以连贯的方式直接解决我的问题。

以下是我的数据示例:

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)

我该如何实现这一目标?

2 个答案:

答案 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