【问题标题】: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()

标签: python list dictionary pandas dataframe


【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-18
      • 2023-01-13
      • 2021-09-07
      • 2021-12-09
      • 1970-01-01
      • 2021-03-03
      • 2021-10-24
      相关资源
      最近更新 更多