Оценить ряд строк / индексов идентичных значений столбцов в панде Dataframe - PullRequest
0 голосов
/ 23 февраля 2019

Прежде чем идти дальше, есть много ответов, касающихся вопроса, который я собираюсь задать.Насколько я могу судить, никто напрямую не решает мою проблему согласованно.

Вот пример моих данных:

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

Вот что я хочу сделать.Я хочу - как можно проще и эффективнее - вычислить индекс RANGE повторяющихся значений API.

Желаемый результат:

API Index_RANGE
5   (0,2)
10  3
12  4
1   (5,6)
100 7
23  (8,9)

Как мне добиться этого?

Ответы [ 2 ]

0 голосов
/ 23 февраля 2019

Если вам требуются кортежи или одно число, я напишу вашу собственную функцию и передам ее .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)
0 голосов
/ 23 февраля 2019

Следующий код производит ожидаемый результат точно, но не является производительным;он будет сильно тормозить с увеличением размера входных данных (из-за понимания списка).

# 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...