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

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

a = 2
b = 3

Я хочу построить DataFrame из этого:

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

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

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

Я тоже пробовал:

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

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

Ответ 1

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

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

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

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

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

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

Ответ 3

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

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

Вы даже можете указать имя столбца.

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

Ответ 4

Вам необходимо предоставить итераторы в качестве значений столбцов Pandas DataFrame:

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

Ответ 5

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

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

DataFrame можно рассматривать как коллекцию Series, поэтому вы можете:

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

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

Ответ 6

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

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

df = pd.DataFrame(data)

Ответ 7

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

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

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

Ответ 8

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

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)

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

planets_df = pd.DataFrame(planets)
print(planets_df)

Ответ 9

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

Ответ 10

Магия панд на работе. Вся логика отсутствует.

Сообщение об ошибке "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

Индекс обычно автоматически генерируется фреймом данных, если он не задан. Тем не менее, панды не знают, сколько строк 2 и 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, хотя.

Я бы рекомендовал всегда передавать словарь списков конструктору dataframe при создании кадров данных. Это легче читать для других разработчиков. У Pandas много предостережений, не заставляйте других разработчиков обращаться к экспертам во всех из них, чтобы прочитать ваш код.

Ответ 11

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

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

Ответ 12

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

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

Из документации по аргументу 'orient': если ключи переданного dict должны быть столбцами результирующего DataFrame, передайте 'столбцы (по умолчанию). В противном случае, если ключи должны быть строками, передайте 'index.

Ответ 13

Вы можете попробовать обернуть свой словарь в список

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

pd.DataFrame([my_dict])

   A  B
0  1  2

Ответ 14

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

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