Разделить список строк и целых чисел на отдельные элементы или строки с одинаковым идентификатором - PullRequest
1 голос
/ 17 апреля 2020

Я хочу иметь строки со списком элементов, сначала у меня был DataFrame с такой структурой:

╔═══════════════════════════════════╦════════════╦══════════╦═════════════╗
║ url                               ║ date       ║ name     ║ numMentions ║
║ www.newspaperarticle              ║ 2018-12-31 ║ Bill     ║ 2           ║
║ www.newspaperarticle              ║ 2018-12-31 ║ Cosby    ║ 3           ║
║ www.newspaperarticle              ║ 2018-12-31 ║ New York ║ 1           ║
║ 
╚═══════════════════════════════════╩════════════╩══════════╩═════════════╝

Я изменил его в структуру, где слова в имени и числа в numMentions присоединяются один раз на URL / имя IDS, сгруппировав их:

 df.groupby(['url','date'], as_index=False).agg({
    'name': lambda x: list(x),
    'numMentions': lambda x: list((map(str,x))),
    'avgSalience':lambda x: list((map(str,x)))
})

И я получил следующий фрейм данных:

╔══════════════════════╦════════════╦═══════════════════════╦═════════════╗
║ url                  ║ date       ║ name                  ║ numMentions ║
║ www.newspaperarticle ║ 2018-12-31 ║ [Bill,Cosby,NewYork]  ║ [2,3,1]     ║
╚══════════════════════╩════════════╩═══════════════════════╩═════════════╝

То, что я хочу, это либо возможность доступа к отдельным словам в списке потому что в настоящее время список - это просто элемент со всеми словами или структурой, как показано ниже:

╔═══════════════════════════════════╦════════════╦══════════╦═════════════╗
║ url                               ║ date       ║ name     ║ numMentions ║
║ www.newspaperarticle              ║ 2018-12-31 ║ Bill     ║ 2           ║
║                                                ║ Cosby    ║ 3           ║
║                                                ║ New York ║ 1           ║
║ 
╚═══════════════════════════════════╩════════════╩══════════╩═════════════╝

Вот пример данных с 10 строками

1 Ответ

1 голос
/ 17 апреля 2020

После группового входа вы можете использовать строковую функцию Pandas Series "join", которая работает так же, как python str "join".

df.name.str.join(' ')

И:

df.numMentions.str.join(' ')

Это даст вам значения, вам просто нужно переназначить их для рассматриваемой серии.

Редактировать

Это сработало для меня:

import pandas as pd
data = {
    'url': ['www.newspaperarticle', 'www.newspaperarticle', 'www.newspaperarticle'],
    'date': ['2018-12-31', '2018-12-31', '2018-12-31'],
    'name': ['Bill', 'Cosby', 'New York'],
    'numMentions': [2, 3, 1]
}
df = pd.DataFrame(data)
grouped = df.groupby(['url','date'], as_index=False).agg({
    'name': lambda x: list(x),
    'numMentions': lambda x: list((map(str, x)))
})
names = grouped.name.str.join(' ')
numMentions = grouped.numMentions.str.join(' ')
new = grouped.assign(name=names, numMentions=numMentions)
print(new)

Это дает:

    url                     date        name                numMentions
0   www.newspaperarticle    2018-12-31  Bill Cosby New York   2 3 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...