【问题标题】:Dictionary to DataFrame Pandas: Error: 6 columns passed, passed data had 2 columns. - While loop in python字典到 DataFrame Pandas:错误:传递了 6 列,传递的数据有 2 列。 - Python中的while循环
【发布时间】:2019-01-15 08:53:16
【问题描述】:

我想将 python 字典转换为 pandas DataFrame,但由于字典值的长度不同,当我这样做时:

recomm = pd.DataFrame(recommendation.items(),columns=['id','recId1','recId2','recId3','recId4','recId5'])

我明白了:

6 列传递,传递的数据有 2 列

这意味着提供的值之一的长度为 2。

为了纠正它,我做了:

for key in recommendation.keys():
    while True:
        l1 = recommendation[key]
        l1.append(0)
        recommendation[key] = l1
        if len(l1) < 5:
            break

但我在转换为 DF 时仍然收到错误。

我查了字典如下:

 for key in recommendation.keys():
    if len(recommendation[key]) != 5:
        print key

发现长度为 5 的也加了 0。意味着我现在有一些长度为 6 的值。 例如字典值:

[12899423, 12907790, 12443129, 12558006, 12880407, 0]

如何更正 while 代码,以便它在列表长度为

有没有更好的方法将字典转换为 pandas DataFrame? 字典键是:int 和 str。

【问题讨论】:

  • 创建pandas数据框不需要调用.items()到dict,直接传递dict即可
  • 无法解决。即使我删除 .items() 也会出现同样的错误

标签: python python-2.7 pandas dictionary


【解决方案1】:

您可以使用以下内容:

在 python 2.7 中使用 iteritems(),因为它在字典上返回一个迭代器,在 python 3.x 中,items() 具有相同的行为

import numpy as np
import pandas as pd
#Your dictionary
d = dict( A = np.array([1,2]), B = np.array([1,2,3,4]) )

df = pd.DataFrame(dict([ (k,pd.Series(v)) for k,v in d.iteritems() ]))

它将用 NaN 值填充缺失条目的数据框,然后您只需调用 fillna 函数:

df.fillna(0,inplace=True)

您丢失的数据现在将用零填充

【讨论】:

  • 我也考虑过转换为 DF 然后 fillna 并应用了这个 df_rec = pd.DataFrame.from_dict(recommendation, orient='index', dtype=None) 但后来不知道如何将索引更改为 [0,1,2,...] 范围内的索引不是字典键。
  • 重置索引可以使用Dataframe.reset_index(drop=True),它会让你的索引从0变为n-1
  • 我尝试了您建议的解决方案并得到 >MemoryError 可能是因为字典的长度为 29000。
  • 这不应该附加,除非你在资源非常低的东西上运行你的代码,我认为你能分享你正在使用的数据吗?作为一个不太优雅的解决方案,您可以尝试初始化一个空(满为 0)数据帧。添加具有您的字典键名称和您拥有的最大列的长度的列。然后用循环填充列。
  • 我认为资源有问题,就像我之前在没有任何 MemoryError 的同一个字典上应用 from_dict 一样,但是当我现在重复它时,它遇到了它。我将重新启动笔记本内核并重复。
猜你喜欢
  • 1970-01-01
  • 2021-08-20
  • 2016-04-09
  • 1970-01-01
  • 2013-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-10
相关资源
最近更新 更多