从变量中的值构造熊猫DataFrame给出“ValueError:如果使用所有标量值,则必须传递索引”

这可能是一个简单的问题,但我不知道如何做到这一点。假设我有两个变量如下。

a = 2
b = 3

我想从这里构造一个DataFrame:

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

这会生成一个错误:

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

我也试过这个:

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

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

1063081 次浏览

错误消息说,如果您要传递标量值,则必须传递索引。因此,您可以不对列使用标量值——例如使用列表:

>>> df = pd.DataFrame({'A': [a], 'B': [b]})
>>> df
A  B
0  2  3

或者使用标量值并传递索引:

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

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

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

您还可以使用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({"key": d.keys(), "value": d.values()})

也许Series会提供您需要的所有功能:

pd.Series({'A':a,'B':b})

DataFrame可以被认为是Series的集合,因此您可以:

  • 将多个Series连接到一个数据帧中(如此处所述

  • 将Series变量添加到存量数据帧中(示例

这是因为DataFrame有两个直观的维度-列行。

您仅使用字典键指定列。

如果您只想指定一维数据,请使用Series!

你需要先创建一个熊猫系列。第二步是将熊猫系列转换为熊猫数据框。

import pandas as pd
data = {'a': 1, 'b': 2}
pd.Series(data).to_frame()

您甚至可以提供列名。

pd.Series(data).to_frame('ColumnName')

如果您打算转换标量字典,则必须包含一个索引:

import pandas as pd


alphabets = {'A': 'a', 'B': 'b'}
index = [0]
alphabets_df = pd.DataFrame(alphabets, index=index)
print(alphabets_df)

尽管索引不是列表字典所必需的,但同样的想法可以扩展到列表字典:

planets = {'planet': ['earth', 'mars', 'jupiter'], 'length_of_day': ['1', '1.03', '0.414']}
index = [0, 1, 2]
planets_df = pd.DataFrame(planets, index=index)
print(planets_df)

当然,对于列表字典,您可以在没有索引的情况下构建数据帧:

planets_df = pd.DataFrame(planets)
print(planets_df)

你可以试试:

df2 = pd.DataFrame.from_dict({'a':a,'b':b}, orient = 'index')

从'orient'参数的留档:如果传递的字典的键应该是结果DataFrame的列,则传递'列'(默认)。否则,如果键应该是行,则传递'index'。

输入不必是记录列表-它也可以是单个字典:

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

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

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


df = pd.DataFrame(data)

只需在列表中传递判决:

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

熊猫的魔法在起作用。所有的逻辑都出来了。

错误消息"ValueError: If using all scalar values, you must pass an index"说您必须传递索引。

这并不一定意味着通过索引会让熊猫做你想让它做什么

当您传递索引时,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

索引通常是在没有给出索引的情况下由数据框自动生成的。但是,熊猫不知道你想要多少行23。但是,你可以更明确地说明它

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的。

我建议在创建数据帧时始终将列表字典传递给数据帧构造函数。对于其他开发人员来说更容易阅读。Pandas有很多警告,不要让其他开发人员必须精通所有这些才能阅读您的代码。

您可以尝试将字典包装成一个列表:

my_dict = {'A':1,'B':2}
pd.DataFrame([my_dict])
   A  B
0  1  2

将字典转换为数据帧

col_dict_df = pd.Series(col_dict).to_frame('new_col').reset_index()

为列命名

col_dict_df.columns = ['col1', 'col2']

你可以试试这个: df2=pd.DataFrame.from_dict({'a': a,'b': b}, orient='index')

将'a'和'b'值更改为列表,如下所示:

a = [2]
b = [3]

然后执行相同的代码,如下所示:

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

你会得到:

    A   B
0   2   3

我通常使用以下方法从dicts快速创建一个小表。

假设您有一个字典,其中键是文件名,值是它们对应的文件大小,您可以使用以下代码将其放入DataFrame中(注意字典上的.项目()调用):

files = {'A.txt':12, 'B.txt':34, 'C.txt':56, 'D.txt':78}
filesFrame = pd.DataFrame(files.items(), columns=['filename','size'])
print(filesFrame)


filename  size
0    A.txt    12
1    B.txt    34
2    C.txt    56
3    D.txt    78

最简单的选项ls:

dict  = {'A':a,'B':b}
df = pd.DataFrame(dict, index = np.arange(1) )

另一种选择是使用字典理解即时将标量转换为列表:

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]}

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

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


​```
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

要找出“ValueError”,需要了解DataFrame和“标量值”。
要从字典创建Dataframe,需要至少一个数组

IMO,数组本身被索引
因此,如果存在类似数组的值,则无需指定index。
例如,['a','s','d','f']中每个元素的索引分别为0,1,2,3。

df_array_like = pd.DataFrame({
'col' : 10086,
'col_2' : True,
'col_3' : "'at least one array'",
'col_4' : ['one array is arbitrary length', 'multi arrays should be the same length']})
print("df_array_like: \n", df_array_like)

输出:

df_array_like:
col  col_2                 col_3                                   col_4
0  10086   True  'at least one array'           one array is arbitrary length
1  10086   True  'at least one array'  multi arrays should be the same length

如输出所示,DataFrame的索引为0和1。
恰好与数组的索引相同['一个数组是任意长度','多个数组应该是相同的长度']

如果注释掉“col_4”,它将提高

ValueError(“如果使用所有标量值,则必须传递索引”)

原因标量值(整数、布尔和字符串)没有索引
注意index(…)必须使用某种集合调用
由于index用于定位DataFrame的所有行
index应该是一个数组。例如

df_scalar_value = pd.DataFrame({
'col' : 10086,
'col_2' : True,
'col_3' : "'at least one array'"
}, index = ['fst_row','snd_row','third_row'])
print("df_scalar_value: \n", df_scalar_value)

输出:

df_scalar_value:
col  col_2                 col_3
fst_row    10086   True  'at least one array'
snd_row    10086   True  'at least one array'
third_row  10086   True  'at least one array'

我是初学者,我正在学习python和英语。👀