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

问题描述 投票:223回答:15

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

a = 2
b = 3

我想从这构造一个DataFrame:

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

这会产生错误:

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

我也尝试了这个:

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

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

python pandas dataframe scalar
15个回答
373
投票

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

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

2
投票

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

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)

1
投票

这是对@fAx的回复的评论:输入不必是记录列表 - 它也可以是单个字典:

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

1
投票

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

错误消息"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。

我建议在创建数据帧时始终将列表字典传递给dataframe构造函数。对其他开发人员来说更容易阅读。熊猫有很多警告,不要让其他开发人员为了阅读你的代码而拥有所有这些专家。


0
投票

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

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

0
投票

将字典转换为数据框

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

为Column命名

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

-2
投票

只需将dict传递到列表中:

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

47
投票

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

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

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

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

33
投票

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

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

您甚至可以提供列名称。

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

12
投票

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

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

pd.DataFrame([my_dict])

   A  B
0  1  2

8
投票

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

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

6
投票

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

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

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

  • 将多个系列连接成一个数据框(如here所述)
  • 将Series变量添加到现有数据框架中(example here

4
投票

我遇到了与numpy数组相同的问题,解决方法是将它们展平:

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

df = pd.DataFrame(data)

3
投票

你可以尝试:

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

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


2
投票

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

您只使用字典键指定列。

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

© www.soinside.com 2019 - 2024. All rights reserved.