Группировка панд по столбцу 1 и добавление разделенных запятыми записей из столбца 2 - PullRequest
0 голосов
/ 16 января 2019

У меня есть фрейм данных pandas с примерно 5 миллионами строк с 2 столбцами "top_level_domain" и "category".Я хотел бы создать новый фрейм данных с различными top_level_domain и столбцом категории, разделенным запятой для уникальных категорий.Этот фрейм данных уже имеет категории, разделенные запятой по своей природе.Другие домены, такие как Google, будут иметь повторяющуюся категорию, но я хочу только одну.

Датафрейм:

df1
    top_level_domain      category
1   google.com            Search Engines
2   service-now.com       Business, Software/Hardware
3   google-analytics.com  Internet Services
4   live.com              None Assigned
5   google.com            Content Server
6   google.com            Search Engines
7   inspectlet.com        Internet Services
8   doubleclick.net       Online Shopping, Web Ads
9   google.com            Search Engines
10  doubleclick.net       Ads

Желаемый вывод:

df2
    top_level_domain      category
1   google.com            Search Engines, Content Server
2   service-now.com       Business, Software/Hardware
3   google-analytics.com  Internet Services
4   live.com              None Assigned
7   inspectlet.com        Internet Services
8   doubleclick.net       Online Shopping, Web Ads, Ads

Какой самый лучший способвыполнить это?

Я перепробовал все примеры из Pandas groupby по нескольким столбцам, списку из нескольких столбцов

и другим, как показано ниже, но я все еще получаю дубликатыв столбце категории.

distinct_category = distinct_category.groupby('top_level_domain')['category'].agg(lambda x: ', '.join(set(x))).reset_index()

Но я получаю дубликаты в столбцах

1   zoho.com    Online Shopping, Interactive Web Applications, Interactive Web Applications, Interactive Web Applications, Motor Vehicles
1   zohopublic.com  Internet Services, Motor Vehicles, Internet Services, Online Shopping, Internet Services

Ответы [ 3 ]

0 голосов
/ 16 января 2019

Сначала разделите столбец по запятой, затем groupby по столбцу и используйте генератор для сглаживания вложенных списков с помощью set и join:

df = (distinct_category['category'].str.split(', ')
                    .groupby(distinct_category['top_level_domain'])
                    .agg(lambda x: ', '.join(set(y for z in x for y in z)))
                    .reset_index())
print (df)

       top_level_domain                        category
0       doubleclick.net   Ads, Online Shopping, Web Ads
1  google-analytics.com               Internet Services
2            google.com  Content Server, Search Engines
3        inspectlet.com               Internet Services
4              live.com                   None Assigned
5       service-now.com     Business, Software/Hardware

Другое решение - присвоить обратно разделенные значения:

df = (distinct_category.assign(category = distinct_category['category'].str.split(', '))
                       .groupby('top_level_domain')['category']
                       .agg(lambda x: ', '.join(set(y for z in x for y in z)))
                       .reset_index())
0 голосов
/ 16 января 2019

У меня работает следующий код:

df =df.groupby('top_level_domain')['category'].agg([('category', ', '.join)]).reset_index()
0 голосов
/ 16 января 2019

Сначала разверните ваш фрейм данных, чтобы каждая строка содержала только одну категорию:

split = df['category'].str.split(', ')
lens = split.str.len()

df = pd.DataFrame({'top_level_domain': np.repeat(df['top_level_domain'].values, lens),
                   'category': np.concatenate(split)})

Затем удалите дубликаты и используйте agg с str.join:

res = df.drop_duplicates()\
        .groupby('top_level_domain')['category'].agg(','.join)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...