我正在尝试用字典创建熊猫数据框。字典键是字符串,值是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)
这并没有给我我想要的结果,我对此感到困惑。有人有想法么?谢谢!
答案 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)其值是嵌套列表中的扁平子列表
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