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

Destinations
Paris,Oslo, Paris,Milan, Athens,Amsterdam
Boston,New York, Boston,London, Paris,New York
Nice,Paris, Milan,Paris, Nice,Milan

Я хочу получить следующий фрейм данных (без пробелов между городами):

Destinations_2                         no_destinations
Paris,Oslo,Milan,Athens,Amsterdam      5
Boston,New York,London,Paris           4
Nice,Paris,Milan                       3

Как удалить дубликаты внутри клетки?

2
Dogukan Yılmaz 29 Июн 2019 в 13:52

4 ответа

Лучший ответ

Вы можете использовать понимание списка, которое быстрее, чем использование apply() (замените Col исходным именем столбца):

df['no_destinations']=[len(set([a.strip() for a in i.split(',')])) for i in df['Col']]
print(df)

                                              Col  no_destinations
0       Paris,Oslo, Paris,Milan, Athens,Amsterdam                5
1  Boston,New York, Boston,London, Paris,New York                4
2             Nice,Paris, Milan,Paris, Nice,Milan                3
3
anky_91 29 Июн 2019 в 10:59
# your data:
import pandas as pd

data = {'Destinations': ['Paris,Oslo, Paris,Milan, Athens,Amsterdam',
                         'Boston,New York, Boston,London, Paris,New York',
                         'Nice,Paris, Milan,Paris, Nice,Milan']}
df = pd.DataFrame(data)

>>>
                                      Destinations
0        Paris,Oslo, Paris,Milan, Athens,Amsterdam
1   Boston,New York, Boston,London, Paris,New York
2              Nice,Paris, Milan,Paris, Nice,Milan

Первый : создайте список в каждой строке столбца.

df.Destinations = df.Destinations.apply(lambda x: x.replace(', ', ',').split(','))

>>>
                                           Destinations
0        [Paris, Oslo, Paris, Milan, Athens, Amsterdam]
1   [Boston, New York, Boston, London, Paris, New York]
2              [Nice, Paris, Milan, Paris, Nice, Milan]

Второй : удаляет дубликаты из списков.

df.Destinations = df.Destinations.apply(lambda x: list(dict.fromkeys(x)))

# or: df.Destinations = df.Destinations.apply(lambda x: list(set(x)))

>>>
                               Destinations
0   [Paris, Oslo, Milan, Athens, Amsterdam]
1         [Boston, New York, London, Paris]
2                      [Nice, Paris, Milan]

Наконец , создайте нужные столбцы

df['no_destinations'] = df.Destinations.apply(lambda x: len(x))

df['Destinations_2'] = df.Destinations.apply(lambda x: ','.join(x))

Все шаги используют функции apply и lambda, вы можете объединить их в цепочку или объединить, если хотите

1
steven 29 Июн 2019 в 13:13
df['no_destinations'] = df.Destinations.str.split(',').apply(set).apply(len)

Если между ними есть пробелы

df.Destinations.str.split(',').apply(lambda x: list(map(str.strip,x))).apply(set).apply(len)

< Сильный > Выход

                                     Destinations  nodestinations
0       Paris,Oslo, Paris,Milan, Athens,Amsterdam               5
1  Boston,New York, Boston,London, Paris,New York               4
2             Nice,Paris, Milan,Paris, Nice,Milan               3
1
iamklaus 29 Июн 2019 в 11:16

Все предыдущие ответы касались только одной части вашей проблемы, т. Е. Показывать уникальный счет (no_destinations). Позвольте мне ответить на оба ваших вопроса.

Идея ниже состоит в том, чтобы применить метод к столбцу Destinations, который возвращает 2 серии с именами Destinations_2 и no_destinations, которые содержат уникальные элементы, разделенные запятой без пробелов, и количество уникальных элементов соответственно ,

import pandas as pd
data = {'Destinations': ['Paris,Oslo, Paris,Milan, Athens,Amsterdam', 
                'Boston,New York, Boston,London, Paris,New York',
                'Nice,Paris, Milan,Paris, Nice,Milan'
    ]}

def remove_dups(x):
    data = set(x.replace(" ", "").split(','))
    return pd.Series([','.join(data),len(data)], index=['Destinations_2', 'no_destinations'])

df = pd.DataFrame.from_dict(data)
df[['Destinations_2', 'no_destinations']] = df['Destinations'].apply(remove_dups)
print(df.head())

Выход:

enter image description here

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

0
Chankey Pathak 29 Июн 2019 в 12:07