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

a = 2
b = 3

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

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

这会产生一个错误:

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

我也试过这个:

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

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


当前回答

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

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

df = pd.DataFrame(data)

其他回答

你也可以使用pd.DataFrame.from_records,这在你已经有字典的情况下更方便:

df = pd.DataFrame.from_records([{ 'A':a,'B':b }])

你也可以设置索引,如果你想,通过:

df = pd.DataFrame.from_records([{ 'A':a,'B':b }], index='A')

输入不一定是一个记录列表,也可以是一个字典:

pd.DataFrame.from_records({'a':1,'b':2}, index=[0])
   a  b
0  1  2

这似乎相当于:

pd.DataFrame({'a':1,'b':2}, index=[0])
   a  b
0  1  2

你需要提供可迭代对象作为Pandas DataFrame列的值:

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

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

错误信息“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有很多注意事项,不要让其他开发人员为了阅读你的代码而不得不成为所有这些方面的专家。

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

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

​```