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

时间:2013-07-24 16:40:24

标签: python pandas dataframe scalar

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

a = 2
b = 3

我想从中构建一个DataFrame:

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

这会产生错误:

  

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

我也尝试了这个:

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

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

21 个答案:

答案 0 :(得分:364)

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

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

答案 1 :(得分:42)

您还可以使用pd.DataFrame.from_records,这在您手头有字典时会更方便:

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

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

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

答案 2 :(得分:31)

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

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

您甚至可以提供列名。

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

答案 3 :(得分:10)

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

android.widget.ImageView

<style> .et_pb_column_4_4{ width: 25%; margin-right: 0%; padding: 0px 15px; box-sizing: border-box; } </style>

dash_layout_components = {
'time_slider_app2': 'value',
'backtest_choice_app2': 'values',
'asset_selection_app2': 'value',
'graph_selection_app2': 'values'
}

stored_layout_value_name = [key[:key.rfind('a')] + value for key, value in 
dash_layout_components.items()]

set_back_and_display_graph_input = {
    'store_layout_data': 'modified_timestamp',
    'tabs': 'value'
}


@app.callback(
Output('store_layout_data', 'data'),
[Input(key, value) for key, value in dash_layout_components.items()])
def store_layout(time_slider_value, backtest_choice_values, assets_selection_values, graph_selection_values):

    data_json = {
        'time_slider_value': time_slider_value,
        'backtest_choice_values': backtest_choice_values,
        'asset_selection_value': assets_selection_values,
        'graph_selection_values': graph_selection_values
   }
   return data_json


for component_id, component_property in dash_layout_components.items():
@app.callback(
    Output(component_id, component_property),
    [Input(key, value) for key, value in set_back_and_display_graph_input.items()],
    [State('store_layout_data', 'data'),
     State(component_id, 'id')]
)
def set_back_component(bouton_ts, tabs_value, layout_state_data, component):  # dynamiser l'arrivée des paramètres. piste, en créer une liste entre le for et le callback

    if tabs_value != '/app2':
        raise PreventUpdate

    if layout_state_data is None:
        return []

    else:
        store_layout_component_name = stored_layout_value_name[list(dash_layout_components.keys()).index(component)]
        return layout_state_data[store_layout_component_name]

答案 4 :(得分:8)

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

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

答案 5 :(得分:6)

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

setStyle(DialogFragment.STYLE_NORMAL, android.R.style.Theme_Black_NoTitleBar);

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

  • 将多个系列连接成一个数据框(如here所述)

  • 将Series变量添加到现有数据框(example here

答案 6 :(得分:4)

我在numpy数组上遇到了同样的问题,解决方案是将它们展平:

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

df = pd.DataFrame(data)

答案 7 :(得分: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)

答案 8 :(得分:2)

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

您只使用字典键指定列。

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

答案 9 :(得分: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]}

答案 10 :(得分:1)

你可以尝试:

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

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

答案 11 :(得分: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

答案 12 :(得分: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的。

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

答案 13 :(得分:1)

您可以尝试以下操作: df2 = pd.DataFrame.from_dict({'a':a,'b':b},orient ='index')

答案 14 :(得分:1)

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

a = [2]
b = [3]

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

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

您将获得:

    A   B
0   2   3

答案 15 :(得分:1)

我通常使用以下内容从字典快速创建一个小表。

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

df <- data.frame(first = c("apple", "grape", "rose", "Jasmine", "Apricots", "mango", "banana", "Blueberries"),
                 Last =  c("Jackfruit", "Kiwi", "Mulberry", "rabbit ", "pine", "Limes", "", "Nectarine"),
                 Phone1 = c("1234567890", "(456)7089123", "1230789456", "", "999999", " ", "1112223334", "9998887775"),
                 Phone2 = c("1234737650", "", "15", "8888888888", "99", "3336783245 ", "", "2222222222"))

答案 16 :(得分:1)

我试过 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

​```

答案 17 :(得分:0)

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

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

答案 18 :(得分:0)

将字典转换为数据框

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

为列指定新名称

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

答案 19 :(得分:0)

最简单的选项ls:

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

答案 20 :(得分:-2)

只需将字典传递给列表即可

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