it-roy-ru.com

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

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

a = 2
b = 3

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

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

Это приводит к ошибке:

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

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

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

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

234
Nilani Algiriyage

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

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

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

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

Вы также можете установить индекс, если хотите, следующим образом:

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

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

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

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

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

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

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

pd.DataFrame([my_dict])

   A  B
0  1  2
11
NewBie

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

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

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

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

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

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

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

6
Rob

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

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

df = pd.DataFrame(data)
4
MicheleDIncecco

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

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

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

3
Matthew Connell

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

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)
2
k0L1081

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

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

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

2
danuker

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

Сообщение об ошибке "ValueError: If using all scalar values, you must pass an index" Говорит, что вы должны передать индекс.

Это не обязательно означает, что передача индекса заставляет pandas делать что вы хотите, чтобы он делал

Когда вы передаете индекс, 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

Индекс обычно автоматически генерируется кадром данных, если он не указан. Однако pandas не знает, сколько строк 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 имеет много предостережений, не заставляйте других разработчиков обращаться к экспертам по всем из них, чтобы прочитать ваш код.

1
firelynx

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

Преобразовать словарь в фрейм данных

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

Дайте новое имя колонке

col_dict_df.columns = ['col1', 'col2']
0
kamran kausar

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

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