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

Nil*_*age 288 python scalar dataframe pandas

这可能是一个简单的问题,但我无法弄清楚如何做到这一点.可以说我有两个变量如下.

a = 2
b = 3
Run Code Online (Sandbox Code Playgroud)

我想从这构造一个DataFrame:

df2 = pd.DataFrame({'A':a,'B':b})
Run Code Online (Sandbox Code Playgroud)

这会产生错误:

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

我也尝试了这个:

df2 = (pd.DataFrame({'a':a,'b':b})).reset_index()
Run Code Online (Sandbox Code Playgroud)

这给出了相同的错误消息.

DSM*_*DSM 445

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

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

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

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

  • 也许是因为Python中列表中项目的顺序是持久的,而字典中项目的顺序则不是.您可以使用空字典实例化DataFrame.原则上我认为这里显示的单行DataFrame也可以从字典构建,因为顺序无关紧要(但尚未实现).但是,对于多行,Pandas将无法生成DataFrame,因为它不知道哪些项属于同一行. (6认同)
  • @VitalyIsaev - 在这种情况下,数据帧行(由给定字典表示)没有索引(甚至不是隐式索引).一个简单的解决方案是将字典包装在列表中,该列表具有"自然索引".可以声称,如果只给出一个字典(没有包装列表),则假设`index = 0`,但这可能导致意外误用(认为单个字典可以某种方式创建多行数据帧) (2认同)
  • 这样做的原因是因为 DataFrame 旨在保存二维数据(即 OP 的两个变量的行)。如果您只想保存索引 -> 值对(如字典),那么您应该使用 Series,如 [Rob](/sf/answers/2566945111/) 建议的那样。 (2认同)

fAX*_*fAX 53

pd.DataFrame.from_records当你手头有字典时,你也可以使用哪个更方便:

df = pd.DataFrame.from_records([{ 'A':a,'B':b }])
Run Code Online (Sandbox Code Playgroud)

如果需要,您还可以通过以下方式设置索引:

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

  • 这个答案对我不起作用 - 使用from_records时收到相同的错误信息. (22认同)
  • @DaveKielpinski您是否忘记添加括号? (9认同)

MLg*_*guy 44

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

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

您甚至可以提供列名称.

pd.Series(data).to_frame('ColumnName')
Run Code Online (Sandbox Code Playgroud)

  • `pd.Series(data).to_frame('ColumnName')` 更短,虽然这个等价物可能更直接:`pd.DataFrame.from_dict(data, orient='index', columns=['ColumnName'])` (3认同)

New*_*ie 23

您可以尝试将字典包装到列表中

my_dict = {'A':1,'B':2}

pd.DataFrame([my_dict])

   A  B
0  1  2
Run Code Online (Sandbox Code Playgroud)


小智 11

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

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

df = pd.DataFrame(data)
Run Code Online (Sandbox Code Playgroud)


fir*_*ynx 11

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

错误消息"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
Run Code Online (Sandbox Code Playgroud)

传递更大的索引:

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
Run Code Online (Sandbox Code Playgroud)

当没有给出索引时,索引通常由数据帧自动生成。然而,大熊猫不知道多少行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
Run Code Online (Sandbox Code Playgroud)

不过,默认索引是基于 0 的。

我建议在创建数据框时始终将列表字典传递给数据框构造函数。其他开发人员更容易阅读。Pandas 有很多注意事项,不要让其他开发人员必须精通所有这些知识才能阅读您的代码。


CN_*_*age 10

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

IMO,数组本身是有索引的
因此,如果存在类似数组的值,则无需指定索引。
例如['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)
Run Code Online (Sandbox Code Playgroud)

输出:

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
Run Code Online (Sandbox Code Playgroud)

从输出中可以看出,DataFrame的索引是0和1。
与数组的索引一致['一个数组是任意长度','多个数组应该是相同的长度']

如果注释掉'col_4',它会引发

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

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

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)
Run Code Online (Sandbox Code Playgroud)

输出:

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'
Run Code Online (Sandbox Code Playgroud)

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


M. *_*ohn 9

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
Run Code Online (Sandbox Code Playgroud)

  • 通过额外的支持信息可以改进您的答案。请[编辑]添加更多详细信息,例如引文或文档,以便其他人可以确认您的答案是正确的。您可以[在帮助中心](/help/how-to-answer)找到有关如何写出好的答案的更多信息。 (4认同)
  • 您的答案将“.T”添加到其他答案的建议中。您能解释一下这是如何产生影响的吗? (3认同)

ely*_*ely 8

您需要提供iterables作为Pandas DataFrame列的值:

df2 = pd.DataFrame({'A':[a],'B':[b]})
Run Code Online (Sandbox Code Playgroud)


小智 8

你可以试试:

df2 = pd.DataFrame.from_dict({'a':a,'b':b}, orient = 'index')
Run Code Online (Sandbox Code Playgroud)

来自'orient'参数的文档:如果传递的dict的键应该是结果DataFrame的列,则传递'columns'(默认)。否则,如果键应该是行,则传递“索引”。


小智 6

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

pd.Series({'A':a,'B':b})
Run Code Online (Sandbox Code Playgroud)

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

  • 连接多个系列到一个数据帧(如所描述的在这里)

  • 将Series变量添加到现有数据框中(此处示例)


cot*_*ail 6

如果数据是字典,构造数据帧的一种方法是调用pd.json_normalize()它构造平面数据帧(索引是在幕后创建的)。它的主要用例是展平嵌套字典,但也适用于平面字典。

df = pd.json_normalize({'A': 2, 'B': 3})


   A  B
0  2  3
Run Code Online (Sandbox Code Playgroud)

一般来说,可以通过首先初始化一个空数据帧然后用字典填充它来构造一个数据帧。


如果数据是一些标量值(如OP中所示),则将其包装在列表/元组中并传递给数据帧构造函数(并可选择传递列/索引标签)。嵌套列表构造一个宽数据帧,平面列表构造一个长数据帧。

a = 2
b = 3

df1 = pd.DataFrame([[a, b]], columns=['A', 'B'])


   A  B
0  2  3



df2 = pd.DataFrame([a, b], columns=['A'])


   A
0  2
1  3
Run Code Online (Sandbox Code Playgroud)


S.V*_*S.V 5

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

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

这似乎相当于:

pd.DataFrame({'a':1,'b':2}, index=[0])
   a  b
0  1  2
Run Code Online (Sandbox Code Playgroud)


小智 5

你可以试试这个:

df2 = pd.DataFrame.from_dict({'a':a,'b':b}, orient = 'index')
Run Code Online (Sandbox Code Playgroud)

  • 这与@MathewConnell 发布的答案完全相同,只是没有格式化...... (5认同)

小智 5

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

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

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
Run Code Online (Sandbox Code Playgroud)


小智 5

我尝试了 transpose() 并且它有效。\n缺点:您创建了一个新对象。

\n
testdict1 = {'key1':'val1','key2':'val2','key3':'val3','key4':'val4'}\n\ndf = pd.DataFrame.from_dict(data=testdict1,orient='index')\nprint(df)\nprint(f'ID for DataFrame before Transpose: {id(df)}\\n')\n\ndf = df.transpose()\nprint(df)\nprint(f'ID for DataFrame after Transpose: {id(df)}')\n
Run Code Online (Sandbox Code Playgroud)\n

输出

\n
         0\nkey1  val1\nkey2  val2\nkey3  val3\nkey4  val4\nID for DataFrame before Transpose: 1932797100424\n\n   key1  key2  key3  key4\n0  val1  val2  val3  val4\nID for DataFrame after Transpose: 1932797125448\n\n\xe2\x80\x8b```\n
Run Code Online (Sandbox Code Playgroud)\n