假设我有以下列表:
list1 = [{'a': 1}, {'b': 2}, {'c': 3}]
我想将其转换为具有两列的熊猫数据框:一列用于键,一列用于值。
keys values
0 'a' 1
1 'b' 2
2 'c' 3
为此,我尝试使用pd.DataFrame(list1)
和pd.DataFrame.from_records(list1)
,但是在两种情况下,我都得到一个数据框,如:
a b c
0 1.0 NaN NaN
1 NaN 2.0 NaN
2 NaN NaN 3.0
有什么方法可以指定我想要的吗?通过研究,我只能找到上面描述的方式。
答案 0 :(得分:4)
使用list comprehension
进行平整以获取元组列表:
df = pd.DataFrame([(i, j) for a in list1 for i, j in a.items()],
columns=['keys','values'])
print (df)
keys values
0 a 1
1 b 2
2 c 3
详细信息:
print ([(i, j) for a in list1 for i, j in a.items()])
[('a', 1), ('b', 2), ('c', 3)]
答案 1 :(得分:2)
如果您在字典中使用的键是唯一的,则可以创建一个字典并将其馈送到pd.DataFrame.from_dict
。 collections.ChainMap
可以促进这一点:
from collections import ChainMap
list1 = [{'a': 1}, {'b': 2}, {'c': 3}]
df = pd.DataFrame.from_dict(ChainMap(*list1), orient='index').reset_index()
df.columns = ['key', 'value']
print(df)
key value
0 a 1
1 b 2
2 c 3
或者,您也可以通过列表直接向pd.DataFrame
构造函数供稿:
df = pd.DataFrame(list(ChainMap(*list1).items()))
答案 2 :(得分:0)
@jezrael完美回答了我的问题,但我想指出的是,如果将每个字典({'a':1}
)转换为列表(['a',1]
),则只需要使用{{1 }},获得理想的结果。