Как быстро извлечь строки из DataFrame Pandas, основываясь на значениях столбцов, которые ссылаются на индексы столбцов? - PullRequest
0 голосов
/ 16 июня 2019

У меня есть pandas dataframe из точек, состоящих из мер (здесь я пытаюсь упростить проблему: точка - это широта / долгота на планете, мера - это экземпляр того, что на изображении имеет пиксель x / y ценности). У меня есть столбец для point_id и столбец для серийного номера (изображения). У меня также есть столбец с названием referenceIndex. Индекс ссылки относится к изображению в данной точке, которое использовалось в качестве эталона, с которым сравниваются другие изображения. Вот пример того, как это можно настроить, упрощая имена столбцов и значения ячеек:

   PtID  SN  RI
0   A    a   0
1   A    b   0
2   A    c   0
3   B    b   1
4   B    d   1
5   C    a   1
6   C    e   1

В примере у меня 3 очка. Точка A существует на 3 изображениях (a, b, c), и контрольное изображение было a. Точка B существует на 2 изображениях, и контрольное изображение было d (потому что контрольный индекс = 1). Точка C существует на 2 изображениях, и эталонное изображение e.

Входной файл представляет собой CSV точки_идентификатора, серийный номер для извлечения. Этот список может не иметь контрольной меры в списке, и я не могу его изменить. И, если это не так, мне нужен какой-то способ сохранить его.

Example Input:  {A,a}
Example Output: row: {0}

Example Input:  {C,a}
Example Output: row: {5,6}

Первый пример прост. Второй вариант сложнее: в моем списке входных данных требовалась только строка 5, но для сохранения этой контрольной меры для point_id C мне также нужно извлечь строку 6.

Помощь



P.S. Это код, который я придумал. Оператор else: во много раз медленнее, чем мой оригинальный метод (где оригинальный метод не делает то, что я хочу.

if args.flagKEEPREF == "false":
    newDF_idx =[]
    for measure in arr_measures:
        test = (df.loc[(df.point_id == measure[0]) & (df.serialnumber == measure[1])]).index
        if len(test) > 0:           #account for case where the measure does not exist in the network
            newDF_idx.append(test[0])
    df = df.iloc[list(set(newDF_idx))]
    df.sort_values(by=['point_id', 'serialnumber'])
    df = df.reset_index(drop=True)
else:
    gb = [x for _, x in df.groupby('point_id')] #create groups based on point_id
    newDF_idx = []
    for group in gb:
        referenceIndex = group.iloc[0]['referenceIndex']
        for measure in arr_measures:
            if measure[0] in group['point_id'].values:  #optimization: can pre-screen
                test = (group.loc[(group.point_id == measure[0]) & (group.serialnumber == measure[1])]).index
                if len(test) > 0:                       #account for case where the measure does not exist in the network
                    newDF_idx.append(test[0])
                    newDF_idx.append(group.index[referenceIndex]) #use the index within the group to get the index in the original array
    df = df.iloc[list(set(newDF_idx))]
    df.sort_values(by=['point_id', 'serialnumber'])
    df = df.reset_index(drop=True)
...