найти дубликаты и пометить как вариант - PullRequest
0 голосов
/ 07 сентября 2018

Я пытаюсь создать фрейм данных, в который я добавляю дубликаты как варианты в столбце. Для дальнейшей иллюстрации моего вопроса:

У меня есть датафрейм для панд:

    Case    ButtonAsInteger
0   1       130
1   1       133
2   1       42
3   2       165
4   2       158
5   2       157
6   3       158
7   3       159
8   3       157
9   4       130
10  4       133
11  4       43
... ...     ...

Я преобразовал это в эту форму:

grouped = activity2.groupby(['Case'])
values = grouped['ButtonAsInteger'].agg('sum')
id_df = grouped['ButtonAsInteger'].apply(lambda x: pd.Series(x.values)).unstack(level=-1


        0       1       2       3       4       5       6       7       8       9
Case                                                                                    
1       130.0   133.0   42.0    52.0    47.0    47.0    32.0    94.0    NaN     NaN
2       165.0   158.0   157.0   141.0   142.0   142.0   142.0   142.0   142.0   147.0
3       158.0   159.0   157.0   147.0   166.0   170.0   169.0   130.0   133.0   133.0
4       130.0   133.0   42.0    52.0    47.0    47.0    32.0    94.0    NaN     NaN

А теперь я хочу найти дубликаты и пометить каждый дубликат как вариант. Таким образом, в этом примере Варианты 1 и 4 должны получить вариант 1. Как это:

        Variants    0       1       2       3       4       5       6       7       8       9
Case                                                                                        
1       1           130.0   133.0   42.0    52.0    47.0    47.0    32.0    94.0    NaN     NaN
2       2           165.0   158.0   157.0   141.0   142.0   142.0   142.0   142.0   142.0   147.0
3       3           158.0   159.0   157.0   147.0   166.0   170.0   169.0   130.0   133.0   133.0
4       1           130.0   133.0   42.0    52.0    47.0    47.0    32.0    94.0    NaN     NaN

Я уже попробовал этот метод https://stackoverflow.com/a/44999009. Но он не работает на моем фрейме данных. К сожалению, я не знаю почему.

Вероятно, будет возможно применить двойной цикл for. Поэтому для каждой строки посмотрите, есть ли в записи дубликат. Эффективно ли это для большой записи, я не знаю.

Я также добавил свою процедуру с группировкой, потому что, возможно, на этом этапе уже есть возможность работать с дубликатами?

1 Ответ

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

Это группирует по всем столбцам и возвращает индекс группы (+ 1, потому что индексация по умолчанию равна нулю). Я думаю, что это должно быть то, что вы хотите.

id_df['Variant'] = id_df.groupby(
    id_df.columns.values.tolist()).grouper.group_info[0] + 1

Полученный фрейм данных с учетом ваших входных данных, как указано выше:

        0    1    2  Variant
Case                        
1     130  133   42        1
2     165  158  157        3
3     158  159  157        2
4     130  133   42        1

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

...