将带有值列表的字典转换为数据框

Posted

技术标签:

【中文标题】将带有值列表的字典转换为数据框【英文标题】:Converting a dictionary with lists for values into a dataframe 【发布时间】:2014-10-07 04:35:05 【问题描述】:

我花了一段时间查看 SO,似乎我遇到了一个独特的问题。

我有一本如下所示的字典:

dict=
    123: [2,4],
    234: [6,8],
    ...

我想将这个包含值列表的字典转换为 3 列数据框,如下所示:

time, value1, value2
123, 2, 4
234, 6, 8
...

我可以跑:

pandas.DataFrame(dict)

但这会产生以下内容:

123, 234, ...
2, 6, ...
4, 8, ...

可能是一个简单的解决方法,但我仍在挑选熊猫

【问题讨论】:

pandas.DataFrame(dict).transpose() 【参考方案1】:

您可以按照 levi 的建议对数据进行预处理,也可以在创建数据框后对其进行转置。

testdict=
    123: [2,4],
    234: [6,8],
    456: [10, 12]

df = pd.DataFrame(testdict)
df = df.transpose()

print(df)
#      0  1
# 123  2  4
# 234  6  8

【讨论】:

【参考方案2】:

如果您有大量索引,Roger Fan 的 pandas.DataFrame(dict) 方法实际上会很慢,这可能会让一些人感兴趣。更快的方法是将数据预处理到单独的列表中,然后从这些列表中创建一个 DataFrame。 (也许这在 levi 的回答中有所解释,但现在已经消失了。)

例如,考虑这个字典,dict1,其中每个值都是一个列表。具体来说,dict1[i] = [ i*10, i*100](为了便于检查最终数据帧)。

keys = range(1000)
values = zip(np.arange(1000)*10, np.arange(1000)*100)
dict1 = dict(zip(keys, values))

使用 pandas 方法大约需要 30 倍的时间。例如。

t = time.time()
test1 = pd.DataFrame(dict1).transpose()
print time.time() - t

0.118762016296

对比:

t = time.time()
keys = []
list1 = []
list2 = []
for k in dict1:
    keys.append(k)
    list1.append(dict1[k][0])
    list2.append(dict1[k][1])
test2 = pd.DataFrame('element1': list1, 'element2': list2, index=keys)
print time.time() - t

0.00310587882996

【讨论】:

以上是关于将带有值列表的字典转换为数据框的主要内容,如果未能解决你的问题,请参考以下文章

将具有值列表的字典转换为数据框

将字典列表转换为数据框时处理缺失值[重复]

将标准 python 键值字典列表转换为 pyspark 数据框

将带有嵌套列表的列表转换为带有嵌套数据框的单行小标题

将字典列表转换为数据框 [重复]

将 pyspark 数据框转换为 python 字典列表