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


368

这可能是一个简单的问题,但是我不知道该怎么做。可以说我有两个变量,如下所示。

a = 2
b = 3

我想从中构造一个DataFrame:

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

这会产生一个错误:

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

我也尝试过这个:

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

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

Answers:


568

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

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

7
可能是因为Python中列表中项目的顺序是持久的,而字典中项目的顺序却不是。您可以使用空字典实例化DataFrame。原则上,我认为从字典构建此处所示的单行DataFrame也可以,因为顺序无关紧要(但这尚未实现)。但是,对于多行,Pandas将无法制作DataFrame,因为它不知道哪些项目属于同一行。
亚历山大

2
@VitalyIsaev-在这种情况下,数据框行(由给定的字典表示)没有索引(甚至没有隐式索引)。一种简单的解决方案是将字典包装在确实具有“自然索引”的列表中。可以声称,如果只给出一个字典(没有包装列表),则假设index=0,但这可能导致意外使用(认为单个字典可以以某种方式创建多行数据帧)
Ori


这样做的原因是因为DataFrames旨在保存二维数据(即,OP的两个变量的行)。如果只想保留索引->值对(如Dictionary),则应使用Rob所建议的Series 。
danuker

这是单个采样/行数据帧,因此index = [0]具有逻辑意义;但您也可以将其设置为index = [100],这是可行的。问:索引不是应该按逻辑顺序递增,为什么python允许索引操作?
Sumanth Lazarus

65

pd.DataFrame.from_records当您已经有了字典时,也可以使用以下方法更方便:

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

您还可以根据需要通过以下方式设置索引:

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

27
这个答案对我不起作用-使用from_records时出现相同的错误消息。
Dave Kielpinski

戴夫,您是否尝试过这段代码(当然要定义a和b)?您仍然收到错误消息吗?你可以发表吗?
传真

12
@DaveKielpinski您是否忘了添加括号?
丹尼斯

这将使用dict键作为列名。如何设置索引键?
mingchau

@DaveKielpinski请检查您是否将列表传递给“ from_records”方法;否则它将无法正常工作,并且您将获得与在字典上调用DataFrame时相同的错误消息。
mairan

55

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

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

您甚至可以提供列名。

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

1
这对我有用。我的字典有整数键和ndarray值。
StatsSorceress

pd.Series(data).to_frame('ColumnName')较短,尽管这种等效也许更直接:pd.DataFrame.from_dict(data, orient='index', columns=['ColumnName'])
Alex F

29

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

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

pd.DataFrame([my_dict])

   A  B
0  1  2

8

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

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

可以将DataFrame视为Series的集合,因此您可以:

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

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


7

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

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

6

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

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

df = pd.DataFrame(data)

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)

3

您可以尝试:

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

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


请使用格式化工具正确编辑和格式化您的问题/答案。句子中的代码被格式化为code 非常重要的话是大胆的,较小的重要onces 斜体此外,如果需要,可以使用列表
莫尔斯

这不能解决所问的问题,它会产生与期望的结果不同的结果。
肯·威廉姆斯

3

熊猫魔术在工作。一切逻辑都搞定了。

错误消息"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有很多警告,不要让其他开发人员必须要拥有所有这些方面的专家才能阅读您的代码。


3

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

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

2

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

您仅使用字典键指定列。

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


0

将字典转换为数据框

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

为列命名

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

-2

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

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

它有效,但是恕我直言,它没有多大意义<code>`<!-语言:lang-py-> fruit_count = defaultdict(int)fruits_count [“ apples”] = 10 Fruits_count [“ bananas”] = 21 pd.DataFrame({“ key”:fruits_count.keys(),“ value”:fruits_count.values()})Out:键值0(香蕉,苹果)(21、10)1(香蕉,苹果)(21, 10)<code>
Emiter

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.