Построение фрейма данных pandas из значений переменных дает " ValueError: если вы используете все скалярные значения, вы должны передать индекс"

это может быть простой вопрос, но я не могу понять, как это сделать. Допустим, что у меня есть две переменные следующим образом.

a = 2
b = 3

Я хочу построить фрейм данных из этого:

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

это создает ошибку:

ValueError: при использовании всех скалярных значений необходимо передать индекс

Я попытался это:

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

Это дает то же сообщение об ошибке.

12 ответов


в сообщении об ошибке говорится, что если вы передаете скалярные значения, вы должны передать индекс. Поэтому вы можете либо не использовать скалярные значения для столбцов-например, использовать список:

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

вы также можете использовать pd.DataFrame.from_records что более удобно, когда у вас уже есть словарь в руки:

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

вы также можете установить индекс, если хотите, по:

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

сначала вам нужно создать серию панд. Второй шаг-преобразовать серию pandas в фрейм данных pandas.

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

вы должны предоставить итерируемые объекты в качестве значений для панд столбцов таблицы данных:

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

возможно, серия обеспечит все необходимые функции:

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

DataFrame можно рассматривать как набор рядов, поэтому вы можете:

  • объединить несколько рядов в один фрейм данных (как описано здесь )

  • добавить переменную серии в существующий фрейм данных (пример )


Это потому, что фрейм данных имеет два интуитивных измерения-столбцы и строки.

вы только указываете столбцы, используя ключи словаря.

Если вы хотите указать только одномерные данные, используйте серию!


Если вы собираетесь преобразовать словарь скаляров, вы должны включить индекс:

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)

У меня была та же проблема с массивами numpy, и решение состоит в том, чтобы сгладить их:

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

df = pd.DataFrame(data)

Это комментарий к ответу @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

вы можете попробовать:

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

из документации по аргументу "orient": если ключи переданного dict должны быть столбцами результирующего фрейма данных, передайте "columns" (по умолчанию). В противном случае, если ключи должны быть строками, передайте ‘index’.


если у вас есть словарь, вы можете превратить его в фрейм данных pandas со следующей строкой кода:

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

просто передайте дикт в списке:

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