从列表或字典创建Pandas DataFrame总是返回空DF

时间:2019-04-25 18:49:47

标签: python pandas dataframe

我正在尝试用字典创建熊猫数据框。字典键是字符串,值是1个或更多列表。我遇到一个奇怪的问题,即使我将pd.DataFrame()命令传递给非空对象(如列表或dict),它始终会返回一个空数据框。 我的代码类似于以下内容:

myDictionary = {"ID1":[1,2,3], "ID2":[10,11,12],[2,34,11],"ID3":[8,3,12]}
df = pd.DataFrame(myDictionary, columns = ["A","B","C"])

所以我想创建一个看起来像这样的DF:

    A  B  C 
ID1 1  2  3
ID2 10 11 12
ID2 2  34 11
ID3 8  3  12

当我检查df的内容时,我得到“ Empty DataFrame”,并且如果对其内容进行迭代,那么我将仅获得列名,而myDictionary中没有任何数据!我已经检查了文档,这应该是一个strightforward命令:

pd.DataFrame(dict, columns)

这并没有给我我想要的结果,我对此感到困惑。有人有想法么?谢谢!

6 个答案:

答案 0 :(得分:1)

尝试下面的示例以弄清df为空的原因:

myDictionary = {"ID1":[1,2,3], "ID2":[10,11,12],"ID3":[8,3,12], 'A':[0, 0, 0]}
df = pd.DataFrame(myDictionary, columns = ["A","B","C"])

而您想要的是:

myDictionary = {"ID1":[1,2,3], "ID2":[10,11,12],"ID3":[8,3,12]}
df = pd.DataFrame(myDictionary).rename(columns={'ID1':'A', 'ID2':'B', 'ID3':'C'})

答案 1 :(得分:1)

在这种情况下,我建议您将列表列表解释为字符串。以后,如果您需要编辑或分析其中的任何一个,则可以使用解析器来解释列。

请参见下面的工作代码,该代码可让您将列表列表保留在数据框中。

myDictionary = {"ID1":'[1,2,3]', "ID2":'[10,11,12],[2,34,11]',"ID3":'[8,3,12]'}


df = pd.DataFrame(myDictionary, columns = ["ID1","ID2","ID3"], index = [0])
df.rename(columns ={'ID1' : 'A', 'ID2': 'B', 'ID3': 'C'}, inplace = True)
df.head(3)

通过始终将列表转换为字符串,无论需要组合多少个列表,您都可以轻松地将它们组合起来。

答案 2 :(得分:0)

您要将名称“ ID1”,“ ID2”和“ ID3”传递到pd.DataFrame作为列名,然后告诉熊猫使用A,B,C列。因为没有A,B列,C pandas返回一个空的DataFrame。使用下面的代码制作DataFrame:

import pandas as pd

myDictionary = {"ID1": [1, 2, 3], "ID2": [10, 11, 12], "ID3": [8, 3, 12]}
df = pd.DataFrame(myDictionary, columns=["ID1", "ID2", "ID3"])
print(df)

输出:

   ID1  ID2  ID3
0    1   10    8
1    2   11    3
2    3   12   12

此外:

"ID2":[10,11,12],[2,34,11]

是不正确的,因为您正在尝试为字典中的一个值传递2个键,或者忘记为值[2,34,11]设置键。因此,除非您删除该列表,否则您的字典在尝试编译时应该返回错误。

答案 3 :(得分:0)

首先[2,34,11]列表缺少列名。给个名字!

发生错误的原因是,当您使用以下命令时:

df = pd.DataFrame(myDictionary, columns = ["A","B","C"])

它根据您的字典创建一个数据框。但是,这就是说,您只想要字典中标有“ A”,“ B”,“ C”的列,而字典中没有这些列。

请尝试:

df = pd.DataFrame(myDictionary, columns = ["ID1","ID2","ID3"])
df.rename(columns ={'ID1' : 'A', 'ID2': 'B', 'ID3': 'C'}, inplace = True)

答案 4 :(得分:0)

您无法创建一个数据行,其中两个行级别都与您的示例相同

ID2 10 11 12
ID2 2  34 11

同时,对于字典也是如此,在字典中每个键都必须是唯一的,但是在您的数据帧中像下面的字典一样被引用

{"ID2":[10,11,12],"ID2":[2,34,11]}

所以我建议您词典设计,并遵循许多将字典转换为df的答案

答案 5 :(得分:0)

这是一种可能的方法

字典

myDictionary = {"ID1":[1,2,3], "ID2":[[10,11,12],[2,34,11]],"ID3":[8,3,12]}

获取字典d,其中包含嵌套列表的值的键值,这些嵌套列表的(a)键是唯一的-使用后缀以确保该字典的键{{1 }}是唯一的,并且(b)其值是嵌套列表中的扁平子列表

  • 为此,遍历循环并
    • check(如果值包含子列表)
      • 如果是这样,请将该d对附加到单独的字典key:value
        • 使用后缀来分隔相同的键,因为键d不能在字典中重复
          • 每个后缀将保留嵌套列表中的一个子列表
        • 从原始字典(在名为ID2 nested_keys的变量中生成键列表),其值是嵌套列表
myDictionary

(使用值为嵌套列表的键的列表-d = {} nested_keys = [] for k,v in myDictionary.items(): if any(isinstance(i, list) for i in v): for m,s in enumerate(v): d[k+'_'+str(m+1)] = s nested_keys.append(k) print(d) {'ID2_1': [10, 11, 12], 'ID2_2': [2, 34, 11]} )获取第二个包含不是嵌套列表的值的字典-请参见{ {3}},了解操作方法

nested_keys

this SO post将上面的2个词典合并为一个词典

myDictionary = {key: myDictionary[key] for key in myDictionary if key not in nested_keys}

print(myDictionary)
{'ID1': [1, 2, 3], 'ID3': [8, 3, 12]}

将合并的字典转换为myDictionary = {**d, **myDictionary} print(myDictionary) {'ID2_1': [10, 11, 12], 'ID2_2': [2, 34, 11], 'ID1': [1, 2, 3], 'ID3': [8, 3, 12]} ,并删除之前添加的后缀

DataFrame