Получить все идентификаторы повторяющихся строк в фрейме данных в Pandas - PullRequest
0 голосов
/ 14 ноября 2018

Предположим, у нас есть фрейм данных df с дублированными строками. Я хочу сохранить идентификаторы уникальных строк, чтобы у каждого был связанный список целых чисел (идентификаторов, в которых они появляются в кадре данных).

Позвольте мне показать пример:

import numpy as np
import pandas as pd

np.random.seed(0)
m = ['a','b']
M = ['X','Y']
n = np.arange(3)
size = 10
df = pd.DataFrame({'m': np.random.choice(m, size=size, replace=True),
                   'M': np.random.choice(M, size=size, replace=True),
                   'n': np.random.choice(n, size=size, replace=True)})

Создает следующий фрейм данных:

   m  M  n
0  a  Y  2
1  b  X  2
2  b  X  0
3  a  Y  1
4  b  X  1
5  b  X  1
6  b  X  1
7  b  X  0
8  b  X  1
9  b  Y  0

Мне кажется, я хочу сделать что-то вроде df.groupby(df.columns.tolist()).size(), но вместо того, чтобы получать количество появлений, я хочу получить позиции там, где они появляются. Таким образом, в этом случае желаемый результат будет (например, в форме словаря):

output = {('a','Y',1):[3],
          ('a','Y',2):[0],
          ('b','X',0):[2,7],
          ('b','X',1):[4,5,6,8],
          ('b','X',2):[1],
          ('b','Y',0):[9]
          }

Как я могу это сделать? Идея состоит в том, чтобы сделать это как можно более эффективным, поскольку в фрейме данных может быть несколько столбцов и несколько тысяч (или даже несколько миллионов) строк.

1 Ответ

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

У вас есть groups

df.groupby(list(df)).groups
Out[176]: 
{('a', 'Y', 1): Int64Index([3], dtype='int64'),
 ('a', 'Y', 2): Int64Index([0], dtype='int64'),
 ('b', 'X', 0): Int64Index([2, 7], dtype='int64'),
 ('b', 'X', 1): Int64Index([4, 5, 6, 8], dtype='int64'),
 ('b', 'X', 2): Int64Index([1], dtype='int64'),
 ('b', 'Y', 0): Int64Index([9], dtype='int64')}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...