愚蠢的问题,但我无法为我的生活做这项工作。
我有一个简单的函数,它接受一个列值,并返回具有该列值的所有行。假设它返回出版商的所有书籍:
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)
到达那里,但无法弄清楚如何获得每个出版商的书籍清单。
答案 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']}