Python применить функцию к списку, сохранить результат в виде списка - PullRequest
0 голосов
/ 06 мая 2018

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

У меня есть простая функция, которая принимает значение столбца и возвращает все строки с этим значением столбца. Скажем, он возвращает все книги издателя:

def book_publisher(publisher, df):
    books = df.loc[df['publisher_name'] == name]['book_name']
    return [books]

Используя эту функцию, я хотел бы получить список списков книг всех издателей:

[[book1, book2,],[book3, book4]]

Конечная цель - создать словарь так:

{publisher1:[list of books], publisher2:[list of books]}

Я подумал, что просто использовал бы

zip(list of publishers, list of books)

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

Ответы [ 4 ]

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

Панды pd.DataFrame.groupby('publisher_name').groups возвращает диктант с издателями в качестве ключей и объектами индекса строки pd.Index() в качестве значений. Если вы установите индекс DataFrame на 'book_name', вы получите нужные списки книг в качестве значений.

Используя Aechlys 'пример:

df = pd.DataFrame({'publisher_name': ['john', 'mark', 'john', 'fred','john'],
                       'book_name' : ['aa', 'bb', 'cc', 'dd','ee']})

  book_name publisher_name
0        aa           john
1        bb           mark
2        cc           john
3        dd           fred
4        ee           john

вы получите диктат по:

pub = df.set_index('book_name').groupby('publisher_name').groups
pub['john']

Index(['aa', 'cc', 'ee'], dtype='object', name='book_name')

Чтобы получить книги в виде списка, просто используйте Index (). Tolist () при доступе к значениям dict:

pub['john'].tolist() 

['aa', 'cc', 'ee']

или сделать все в одной строке:

pub = {k : v.tolist() for k,v in 
           df.set_index('book_name').groupby('publisher_name').groups.items() }

дает желаемое значение только списками в качестве значений

pub

{'fred': ['dd'], 'john': ['aa', 'cc', 'ee'], 'mark': ['bb']}
0 голосов
/ 07 мая 2018

вы можете использовать функцию tolist () вместо [], чтобы конвертировать серии панд в список и не ссылаться на loc () для получения книг

def book_publisher(publisher, df):

    books = df[df['publisher_name'] == name]['book_name']

    return books.tolist()
0 голосов
/ 08 мая 2018

Если у вас есть фрейм данных со столбцами «publisher_name» и «book_name», вы можете сделать это в одну строку, не используя вашу функцию:

{x: [b for b in df[df.publisher_name == x].book_name] for x in df.publisher_name.unique()}
0 голосов
/ 07 мая 2018

Предположим, ваш фрейм данных выглядит следующим образом:

df = pd.DataFrame({'publisher_name': ['john', 'mark', 'john', 'fred','john'], 'book_name' : ['aa', 'bb', 'cc', 'dd','ee']})

  book_name publisher_name
0        aa           john
1        bb           mark
2        cc           john
3        dd           fred
4        ee           john

Мы можем получить словарь, используя словарное понимание:

{name: list(book_publisher(name, df)[0].values) for name in df['publisher_name']}

Если массив numpy также приемлем, вы можете удалить list().

Я не знаю, как выглядят ваши данные. Если это просто фрейм данных со столбцами book_name и publisher_name, вы также можете изменить return [books] на return books в своей функции, а затем вы можете удалить [0] из моего ответа выше.

...