Панды находят дубликаты данных - PullRequest
0 голосов
/ 25 сентября 2018

У меня есть данные, подобные этой, я хочу получить результаты: порядок b и c дублируются.Как я могу решить эту проблему?(Заказ и Товар являются многоиндексными)

Order    Item     A
  a       1       'aaa'
          2       'bb'
  b       1       'aaa'
          2       'bb'
          3       'c'
  C       1       'aaa'
          2       'bb'
          3       'c'

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

Сначала создайте кортежи столбца A для первого уровня MultiIndex:

s = df.groupby(level=0)['A'].apply(tuple)
print (s)
Order
a         ('aaa', 'bb')
b    ('aaa', 'bb', 'c')
c    ('aaa', 'bb', 'c')
Name: A, dtype: object

, а затем верните индексы всех дублированных значений на boolean indexing с Series.duplicated:

out = s.index[s.duplicated(keep=False)]
print (out)
Index(['b', 'c'], dtype='object', name='Order')

РЕДАКТИРОВАТЬ:

df = pd.DataFrame(data=[[1, 1, 10, 20], [1, 2, 30, 40], 
                        [1, 3, 50, 60], [2, 1, 10, 20], 
                        [2, 2, 30, 40], [2, 3, 50, 60],
                        [3, 1, 10, 20], [3, 2, 30, 40],
                        [4, 1, 10, 20], [4, 2, 30, 40]], columns=['id', 'date', 'd1', 'd2']) 
print (df)

s = df.groupby('id')['d1','d2'].agg(tuple)
print (s)
              d1            d2
id                            
1   (10, 30, 50)  (20, 40, 60)
2   (10, 30, 50)  (20, 40, 60)
3       (10, 30)      (20, 40)
4       (10, 30)      (20, 40)

out = s.reset_index().groupby(s.columns.tolist(), sort=False)['id'].apply(tuple).tolist()
print (out)
[(1, 2), (3, 4)]
0 голосов
/ 25 сентября 2018

Это просто.Вы должны преобразовать в Dataframe из объекта groupby и затем использовать метод.

df = df.reset_index()
df.drop_duplicates(keep = 'first', inplace = True)

Если вам нужно отфильтровать по определенным столбцам, тогда

df.drop_duplicates(subset = [col1, col2, ...], keep = 'first', inplace = True)

EDIT

Для дублирования:

df = df.groupby('Order')['A'].apply(list).reset_index()
df = df[df.duplicated(subset = ['A'], keep = False)]

Если вы хотите просто список заказов

list_orders = df['Order'].unique()
...