Построение фрейма данных 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()})