Как определить дубликаты, смежные друг с другом в столбце? - PullRequest
0 голосов
/ 30 ноября 2018

В качестве примера на следующем кадре данных можно определить дубликаты, смежные друг с другом, и добавить информацию в другой столбец?

  G_NUM  PRIM   P_NUM   
0  15     True    135
1  9      False   147
2  9      True    264
3  9      False   537
4  2      False   154
5  10     False   222
6  10     False   370
7  10     False   188
8  14     True    215

Я хочу, чтобы вывод отображался как следующий DF.Столбец PRI имеет кортеж, в котором хранится порядковый номер, общее количество элементов в группе и приоритет в группе.

Для строки 0 (G_NUM = 5) в группе есть только один, поэтому он равен 1/1, и последний элемент кортежа сохраняет приоритет, который в данном случае равен 1.Я хочу установить в столбце PRI значение (1,1,1).

Для строк 1 - 3 (G_Num = 9) их три, поэтому они равны 1/3, 2/3 и 3/3.Для приоритета я хочу, чтобы те PRIM = True имели более высокий приоритет.Если два соседних элемента имеют одинаковый статус PRIM, приоритет имеет тот, который находится на первом месте.

Как это сделать?Спасибо!

  G_NUM  PRIM   P_NUM   PRI
0  15     True    135   (1,1,1)
1  9      False   147   (1,3,2)
2  9      True    264   (2,3,1)
3  9      False   537   (3,3,3)
4  2      False   154   (1,1,1)
5  10     False   222   (1,3,1)
6  10     False   370   (1,3,2)
7  10     False   188   (1,3,3)
8  14     True    215   (1,1,1)

1 Ответ

0 голосов
/ 30 ноября 2018

Как только вы наберете df, как в предыдущем примере, работайте с df.groupby вот так

In [1]: grouped = df.groupby('G_NUM').PRIM
In [2]: tuples = list(zip(grouped.cumcount() + 1, grouped.transform(len), grouped.transform(lambda x: np.argsort(~x.values, kind='mergesort')+1)))
In [3]: tuples 
Out[3]: [(1, 1, 1),
         (1, 3, 2),
         (2, 3, 1),
         (3, 3, 3),
         (1, 1, 1),
         (1, 3, 1),
         (2, 3, 2),
         (3, 3, 3),
         (1, 1, 1)]

Как вам вернуть его в исходное df.Обратите внимание на две ошибки в вашем вопросе: (1) первая G_NUM в df равна 15, а не 5, и (2) индексы ранга последовательности PRI неверны для строк 5-7, поскольку они не увеличиваются.

Вы должны прочитать методику split-apply-Объединить в Pandas.Элементы в zip в моем коде выше служат следующей цели:

  • pd.cumcount() подсчитывает, сколько элементов предшествовало данному элементу, и применяя его к объекту grouped, проецирует этот расчетна каждую группу.
  • grouped.transform(len) подсчитывает количество элементов в каждой группе и выдает его как скалярное значение для каждого данного наблюдения.
  • grouped.transform(lambda x: np.argsort(~x.values)+1) обрабатывает вашу спецификацию по приоритету: np.argsort находит ранг данного элемента в списке - другими словами, он дает перестановку, по которой список будет отсортирован.Применяя argsort к ~ x.values, мы сортируем в порядке убывания.(Я не знаю, действительно ли необходимо ключевое слово kind; я настаиваю на сортировке слиянием, чтобы сортировка была стабильной, и поэтому, когда значения PRIM равны, исходный порядок имеет приоритет; в настоящий момент я не делаю 'Напомним, если quicksort, используемый numpy в качестве значения по умолчанию, изменен на стабильный или нет).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...