Python将函数应用于列表,将结果存储为列表

时间:2018-05-06 20:55:31

标签: python list dictionary list-comprehension

愚蠢的问题,但我无法为我的生活做这项工作。

我有一个简单的函数,它接受一个列值,并返回具有该列值的所有行。假设它返回出版商的所有书籍:

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 :(得分:1)

假设您的数据框如下所示:

depends_on :x11

我们可以使用字典理解来获取字典:

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],然后您可以删除{{1}从我上面的答案。

答案 1 :(得分:0)

您可以使用tolist()函数代替[]将pandas系列转换为list而不引用loc()来获取书籍

def book_publisher(publisher, df):

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

    return books.tolist()

答案 2 :(得分:0)

如果您的数据框是' publisher_name'和' book_name'列,你可以在单行中完成,而不使用你的函数:

{x: [b for b in df[df.publisher_name == x].book_name] for x in df.publisher_name.unique()}

答案 3 :(得分:0)

Pandas 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')

要获取书籍列表,只需在访问dict值时使用Index()。tolist():

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']}