如何将含列表值的字典转换为指定结构的Pandas DataFrame
问题:将字典转换为长格式Pandas DataFrame
现有如下字典:
data = {'key1': [2, 6, 7], 'key2': [9, 5, 3]}
需要将其转换为如下结构的Pandas DataFrame:
key value 0 key1 2 1 key1 6 2 key1 7 3 key2 9 4 key2 5 5 key2 3
已尝试的方法及结果
方法一
import pandas as pd data = {'key1': [2, 6, 7], 'key2': [9, 5, 3]} df = pd.DataFrame(data.items()) print(df)
返回结果:
0 1 0 key1 [2, 6, 7] 1 key2 [9, 5, 3]
方法二
import pandas as pd data = {'key1': [2, 6, 7], 'key2': [9, 5, 3]} df = pd.DataFrame.from_dict(data) print(df)
返回结果:
key1 key2 0 2 9 1 6 5 2 7 3
正确解法
方法1:使用pd.DataFrame.melt()
先将字典转为宽格式DataFrame,再通过melt方法重塑为长格式:
import pandas as pd data = {'key1': [2, 6, 7], 'key2': [9, 5, 3]} # 生成宽格式DataFrame df_wide = pd.DataFrame.from_dict(data) # 转换为目标长格式,指定列名 df_long = df_wide.melt(var_name='key', value_name='value') print(df_long)
输出结果:
key value 0 key1 2 1 key1 6 2 key1 7 3 key2 9 4 key2 5 5 key2 3
方法2:使用pd.Series.explode()
将字典转为Series后,展开列表元素并重置索引:
import pandas as pd data = {'key1': [2, 6, 7], 'key2': [9, 5, 3]} # 生成以字典键为索引的Series s = pd.Series(data) # 展开列表、重置索引并命名列 df_long = s.explode().reset_index(name='value').rename(columns={'index': 'key'}) print(df_long)
输出结果与方法1一致。
方法3:手动构造数据列表
遍历字典键值对,生成(key, value)元组列表后转为DataFrame:
import pandas as pd data = {'key1': [2, 6, 7], 'key2': [9, 5, 3]} # 生成包含所有键值对应关系的元组列表 records = [(k, v) for k, vals in data.items() for v in vals] df_long = pd.DataFrame(records, columns=['key', 'value']) print(df_long)
同样可得到目标格式的DataFrame。
内容的提问来源于stack exchange,提问作者Franck Dernoncourt
相关产品推荐
相关产品推荐

