如何将Pandas列中含多字典的列表展平为多行数据?
解决DataFrame字典列表列的展平问题
我明白你想要把包含字典列表的列拆分成每行对应一个字典的两列结构——Col1固定为'value',Col2是对应字典里的值。之前的代码只提取了每个列表里第一个字典的值,确实满足不了需求,咱们来用Pandas一步步实现你要的效果:
步骤1:准备示例数据(方便演示)
先创建一个和你描述一致的示例DataFrame:
import pandas as pd data = { 'Col1': [ [{'value':'2019-02-02'},{'value':'test1'},{'value':'test2'},{'value':'test3'},{'value':'test4'},{'value':'test5'},{'value':'test6'}], [{'value':'2020-03-03'},{'value':'test7'}] ] } df = pd.DataFrame(data)
步骤2:展平字典列表
我们可以用explode()先把每个列表拆成单独的行(每个字典占一行),再提取字典里的value值,同时设置Col1为固定字符串:
# 一步到位实现展平 result_df = (df.explode('Col1', ignore_index=True) .assign( Col1='value', # 设置Col1的值固定为'value' Col2=lambda x: x['Col1'].str['value'] # 从字典中提取value对应的值 ) [['Col1', 'Col2']]) # 调整列顺序,让Col1在前
运行这段代码后,result_df就会是你想要的结构:
| Col1 | Col2 |
|---|---|
| value | 2019-02-02 |
| value | test1 |
| value | test2 |
| ... | ... |
为什么之前的代码不行?
你之前写的df['Col1'] = [x[0]['value'] for x in df['Col1']]是通过索引x[0]取每个列表的第一个字典的value,所以只会得到每个列表里的第一个元素。而explode()会把列表中的每一个元素都拆成独立的行,这样就能遍历处理所有字典了。
内容的提问来源于stack exchange,提问作者RustyShackleford
相关产品推荐
相关产品推荐

