582

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

a = 2
b = 3

我想从这个构造一个DataFrame:

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

这会产生一个错误:

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

我也试过这个:

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

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

4

23 回答 23

883

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

>>> 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
于 2013-07-24T16:49:48.613 回答
97

当您已经拥有字典时,您还可以使用pd.DataFrame.from_records哪个更方便:

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

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

df = pd.DataFrame.from_records([{ 'A':a,'B':b }], index='A')
于 2016-03-13T13:26:17.427 回答
92

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

my_dict = {'A':1,'B':2}
pd.DataFrame([my_dict])
   A  B
0  1  2
于 2019-01-31T11:00:46.507 回答
72

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

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

您甚至可以提供列名。

pd.Series(data).to_frame('ColumnName')
于 2017-09-12T10:58:47.327 回答
15

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

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

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

  • 将多个系列连接到一个数据帧中(如此所述)

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

于 2016-04-16T22:43:55.003 回答
12

熊猫魔术在工作。所有的逻辑都出来了。

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

这并不一定意味着传递一个索引会让 pandas 做你想做的事

当您传递索引时,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但是,pandas 不知道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 的。

我建议在创建数据框时始终将列表字典传递给数据框构造函数。其他开发人员更容易阅读。Pandas 有很多警告,不要让其他开发人员必须成为所有这些方面的专家才能阅读您的代码。

于 2018-10-14T06:26:48.770 回答
11

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

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

df = pd.DataFrame(data)
于 2018-07-04T11:16:42.773 回答
10

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

df2 = pd.DataFrame({'A':[a],'B':[b]})
于 2013-07-24T16:49:49.647 回答
9

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

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

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
于 2020-10-12T18:30:47.190 回答
8

你可以试试:

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

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

于 2018-03-30T02:02:03.597 回答
5
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
于 2021-11-02T05:51:54.243 回答
4

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

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
于 2018-04-24T15:12:31.673 回答
4

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

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

​```
于 2021-05-03T13:40:36.040 回答
3

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

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)
于 2017-11-30T19:34:20.333 回答
2

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

您仅使用字典键指定列。

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

于 2017-07-22T13:53:46.923 回答
2

最简单的选项 ls :

dict  = {'A':a,'B':b}
df = pd.DataFrame(dict, index = np.arange(1) )
于 2020-12-13T17:09:49.837 回答
2

另一种选择是使用 Dictionary Comprehension 将标量动态转换为列表:

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

表达式 {...} 创建一个新的 dict,其值是 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]}
于 2020-12-27T09:44:37.360 回答
1

将字典转换为数据框

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

为列赋予新名称

col_dict_df.columns = ['col1', 'col2']
于 2019-04-24T13:45:41.623 回答
1

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

a = [2]
b = [3]

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

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

你会得到:

    A   B
0   2   3
于 2020-08-26T08:16:10.573 回答
1

要弄清楚“ValueError”,需要了解 DataFrame 和“标量值”。
要从dict创建 Dataframe ,至少需要一个 Array。

IMO,数组本身是索引的
因此,如果存在类似数组的值,则无需指定索引。
eg ['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(...)
因为用于定位 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)

输出:

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和英语。

于 2022-02-18T01:48:01.310 回答
0

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

于 2020-08-15T02:52:44.940 回答
-2

如果您有字典,则可以使用以下代码行将其转换为 pandas 数据框:

pd.DataFrame({"key": d.keys(), "value": d.values()})
于 2016-04-08T14:53:03.713 回答
-3

只需在列表中传递 dict:

a = 2
b = 3
df2 = pd.DataFrame([{'A':a,'B':b}])
于 2018-09-26T12:36:24.357 回答