这可能是一个简单的问题,但我不知道该怎么做。假设有两个变量。

a = 2
b = 3

我想从这个构建一个数据框架:

df2 = pd.DataFrame({'A':a,'B':b})

这会产生一个错误:

ValueError:如果使用所有标量值,则必须传递一个索引

我也试过这个:

df2 = (pd.DataFrame({'a':a,'b':b})).reset_index()

这将给出相同的错误消息。


当前回答

另一个选项是使用Dictionary Comprehension动态地将标量转换为列表:

df = pd.DataFrame(data={k: [v] for k, v in mydict.items()})

表达式{…}创建一个新的字典,其值是一个包含1个元素的列表。例如:

In [20]: mydict
Out[20]: {'a': 1, 'b': 2}

In [21]: mydict2 = { k: [v] for k, v in mydict.items()}

In [22]: mydict2
Out[22]: {'a': [1], 'b': [2]}

其他回答

如果你有一个字典,你可以用下面这行代码把它转换成pandas数据帧:

pd.DataFrame({"key": d.keys(), "value": d.values()})

熊猫在施展魔法。所有的逻辑都是错误的。

错误信息“ValueError:如果使用所有标量值,您必须传递一个索引”表示您必须传递一个索引。

这并不一定意味着传递一个索引就能让熊猫做你想让它做的事情

当你传递一个索引时,pandas会把你的字典键当作列名,把值当作索引中每个值的列应该包含的值。

a = 2
b = 3
df2 = pd.DataFrame({'A':a,'B':b}, index=[1])

    A   B
1   2   3

传递一个较大的索引:

df2 = pd.DataFrame({'A':a,'B':b}, index=[1, 2, 3, 4])

    A   B
1   2   3
2   2   3
3   2   3
4   2   3

索引通常是由数据帧自动生成的。然而,熊猫不知道你想要多少行2和3。但是你可以更明确地表达出来

df2 = pd.DataFrame({'A':[a]*4,'B':[b]*4})
df2

    A   B
0   2   3
1   2   3
2   2   3
3   2   3

默认的索引是0。

我建议在创建dataframe时,始终将列表字典传递给dataframe构造函数。对于其他开发人员来说,它更容易阅读。Pandas有很多注意事项,不要让其他开发人员为了阅读你的代码而不得不成为所有这些方面的专家。

import pandas as pd
 a=2
 b=3
dict = {'A': a, 'B': b}

pd.DataFrame(pd.Series(dict)).T  
# *T :transforms the dataframe*

   Result:
    A   B
0   2   3

我尝试了转置(),它工作。 缺点:您创建了一个新对象。

testdict1 = {'key1':'val1','key2':'val2','key3':'val3','key4':'val4'}

df = pd.DataFrame.from_dict(data=testdict1,orient='index')
print(df)
print(f'ID for DataFrame before Transpose: {id(df)}\n')

df = df.transpose()
print(df)
print(f'ID for DataFrame after Transpose: {id(df)}')

输出

         0
key1  val1
key2  val2
key3  val3
key4  val4
ID for DataFrame before Transpose: 1932797100424

   key1  key2  key3  key4
0  val1  val2  val3  val4
ID for DataFrame after Transpose: 1932797125448

​```

我对numpy数组也有同样的问题,解决方案是将它们压平:

data = {
    'b': array1.flatten(),
    'a': array2.flatten(),
}

df = pd.DataFrame(data)