Получить уникальные строки из нескольких столбцов в Pandas Dataframe - PullRequest
1 голос
/ 20 января 2020

У меня есть такой кадр данных:

data = {'ID':['nan, -1', '647, 47', '603, 603', '6036299, 6036299']} 

df = pd.DataFrame(data)
df


ID
nan, -1
647, 47
603, 603
6036299, 6036299

Как создать новый столбец, в котором отображаются только уникальные значения в столбце ID?

Вывод:

 ID                       unique
nan, -1                    nan, -1
647, 47                    647, 47
603, 603                   603
6036299, 6036299           6036299

Я пробовал df['unique'] = df.ID.unique() & df['unique'] = [', '.join(set(x.split(', '))) for x in df['ID']], но они не работают.

Ответы [ 2 ]

2 голосов
/ 20 января 2020

Если порядок не важен, ваше второе решение работает хорошо:

df['unique'] = [', '.join(set(x.split(', '))) for x in df['ID']]
print (df)
                 ID   unique
0           nan, -1  -1, nan
1           647, 47  647, 47
2          603, 603      603
3  6036299, 6036299  6036299

Если порядок важен, используйте dict.fromkeys для удаления дубликатов:

df['unique'] = [', '.join(dict.fromkeys(x.split(', ')).keys()) for x in df['ID']]
print (df)
                 ID   unique
0           nan, -1  nan, -1
1           647, 47  647, 47
2          603, 603      603
3  6036299, 6036299  6036299

Если хотите удалить дубликаты все значения сложнее - разбить значения, изменить их на stack, удалить дубликаты и объединить группы обратно:

data = {'ID':['nan, -1', '647, 47', '603, 603', '6036299, 6036299, 47']} 

df = pd.DataFrame(data)

df['unique11'] = [', '.join(set(x.split(', '))) for x in df['ID']]
df['unique12'] = [', '.join(dict.fromkeys(x.split(', ')).keys()) for x in df['ID']]
df['unique2'] = (df['ID'].str.split(', ', expand=True)
                        .stack()
                        .drop_duplicates()
                        .groupby(level=0)
                        .agg(', '.join))
print (df)

                     ID     unique11     unique12  unique2
0               nan, -1      -1, nan      nan, -1  nan, -1
1               647, 47      647, 47      647, 47  647, 47
2              603, 603          603          603      603
3  6036299, 6036299, 47  47, 6036299  6036299, 47  6036299
1 голос
/ 20 января 2020

Это просто многословный, хотя и другой вариант, а не упорядоченный:

df['unique'] = df.ID
              .str.strip()
              .str.split(', ')
              .apply(set)
              .apply(lambda x: ', '.join(x))

       ID                unique
0   nan, -1              -1, nan
1   647, 47              47, 647
2   603, 603             603
3   6036299, 6036299    6036299
...