假设我有一个目录列表:

 my lists = [
    
    {'rank': 2, 'keyword_name': 'mens wallet', 'volume': 456677, 'asin': 'B01MG0ORBL'
    },
    {'rank': 18, 'keyword_name': 'mens wallet', 'volume': 456677, 'asin': 'B0735C9RDZ'
    },
    {'rank': 21, 'keyword_name': 'mens wallet', 'volume': 456677, 'asin': 'B07FPVR858'
    },
    {'rank': 126, 'keyword_name': 'mens wallet', 'volume':   , 'asin': 'B01MG0ORBL'
    },
    {'rank': 128, 'keyword_name': 'mens wallet', 'volume': 456677, 'asin': 'B0735C9RDZ'
    },
    {'rank': 136, 'keyword_name': 'mens wallet', 'volume': 456677, 'asin': 'B07FPVR858'
    },
    {'rank': 19, 'keyword_name': 'leather wallets', 'volume': , 'asin': 'B0735C9RDZ'
    },
    {'rank': 10, 'keyword_name': 'wallets for men', 'volume': 566, 'asin': 'B07FPVR858'
    },
    {'rank': 16, 'keyword_name': 'wallets for men', 'volume': 566, 'asin': 'B0735C9RDZ'
    },
 ]

我想按asin和keyword\u name进行分组,因为它们在dict列表中出现了多次,所以我的目标是创建一个如下所示的数据帧:

    **keyword_name     volume   B01MG0ORBL    B0735C9RDZ       B07FPVR858** // column headers

     mens wallet       456677    2 126         18 128 19 16    21 10
     leather wallets   23                                 
     wallets for men   566                      16              10
     

所以一开始我想

   d = [{d['asin']:d['rank'] for d in l} for l in my_lists]
   pd.dataframe(d)

   
   // save as xlsx file
   writer = pd.ExcelWriter(f"{path}/sheet.xlsx", engine="xlsxwriter")
   d.to_excel(
        writer, sheet_name="Organic", startrow=0, header=True, index=False
    )

但不可能,因为它将遇到错误TypeError: string indices must be integers.

推荐答案

可以创建DataFrame,然后使用list旋转:

df = pd.DataFrame(my_lists)
    
df = df.pivot_table(index=['keyword_name','volume'], 
                    columns='asin', 
                    values='rank', 
                    aggfunc=list)
print (df)
asin                   B01MG0ORBL B0735C9RDZ B07FPVR858
keyword_name    volume                                 
leather wallets 23            NaN       [19]        NaN
mens wallet     456677   [2, 126]  [18, 128]  [21, 136]
wallets for men 566           NaN       [16]       [10]

或将转换后的值连接到字符串:

df = pd.DataFrame(my_lists)

df = (df.assign(rank=df['rank'].astype(str))
        .pivot_table(index=['keyword_name','volume'], 
                     columns='asin', 
                     values='rank', 
                     aggfunc=' '.join, 
                     fill_value=''))
print (df)
asin                   B01MG0ORBL B0735C9RDZ B07FPVR858
keyword_name    volume                                 
leather wallets 23                        19           
mens wallet     456677      2 126     18 128     21 136
wallets for men 566                       16         10

Python相关问答推荐

Polars -转换为PL后无法计算熵.列表

如何在Python中使用io.BytesIO写入现有缓冲区?

Python:在类对象内的字典中更改所有键的索引,而不是仅更改一个键

为什么tkinter框架没有被隐藏?

Python上的Instagram API:缺少client_id参数"

海运图:调整行和列标签

从numpy数组和参数创建收件箱

如何让程序打印新段落上的每一行?

为什么默认情况下所有Python类都是可调用的?

如何过滤包含2个指定子字符串的收件箱列名?

Python解析整数格式说明符的规则?

部分视图的DataFrame

Pandas—在数据透视表中占总数的百分比

使用BeautifulSoup抓取所有链接

未调用自定义JSON编码器

在代码执行后关闭ChromeDriver窗口

基于多个数组的多个条件将值添加到numpy数组

如何删除重复的文字翻拍?

删除特定列后的所有列

Seaborn散点图使用多个不同的标记而不是点