Побудова панд DataFrame із значень змінних дає "ValueError: Якщо ви використовуєте всі скалярні значення, ви повинні передати індекс"


370

Це може бути простим питанням, але я не можу зрозуміти, як це зробити. Скажемо, що у мене є дві змінні наступним чином.

a = 2
b = 3

Я хочу створити DataFrame з цього:

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

Це створює помилку:

ValueError: Якщо ви використовуєте всі скалярні значення, ви повинні пройти індекс

Я також спробував це:

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

Це дає те саме повідомлення про помилку.

Відповіді:


570

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

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

7
Можливо, це тому, що порядок елементів у списку в Python є постійним, тоді як впорядкування елементів у словнику немає. Ви можете створювати DataFrame з порожнім словником. В принципі, я вважаю, що однорядний DataFrame, як показано тут, також буде нормально будувати зі словника, оскільки порядок не має значення (але це не було реалізовано). Однак з декількома рядками Pandas не зможе скласти DataFrame, оскільки не знатиме, які елементи належать до одного рядка.
Олександр

2
@ VitalyIsaev - У цьому випадку рядок даних (представлений даним словником) не має індексу (навіть непрямого). Просте рішення - загорнути словник у список, який має "природну індексацію". Можна стверджувати, що якщо дано лише один словник (без обгорткового списку), то припустимо index=0, але це може призвести до випадкового неправильного використання (думаючи, що один словник може якось створити багаторядковий фрейм даних)
Орі

декілька рішень за цим посиланням eulertech.wordpress.com/2017/11/28/…
Мета Джейсона

Причиною цього є те, що DataFrames призначені для зберігання двовимірних даних (тобто рядків двох змінних OP). Якщо ви хочете просто утримати параметри значень -> значення (наприклад, словник), тоді вам слід використовувати серію, як пропонує Роб .
danuker

Це єдиний зразок / рядок Dataframe, тому index = [0] має логічний сенс; але ви також можете маніпулювати цим показником = = 100, що працює. Запитання: Чи не слід, щоб індекс був логічно упорядкований поступово, чому python дозволяє маніпулювати індексом?
Сумант Лазар

65

Ви також можете скористатись тим, pd.DataFrame.from_recordsщо зручніше, коли у вас вже є словник:

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

Ви також можете встановити індекс, якщо хочете:

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

27
Ця відповідь для мене не працює - я отримую те саме повідомлення про помилку при використанні файлів from_records.
Дейв Кіельпінський

Дейв, ти спробував фрагмент коду (зрозуміти, звичайно, a і b)? Ви все ще отримуєте повідомлення про помилку? Чи можете ви дописувати?
FAX

12
@DaveKielpinski Ви, можливо, забули додати дужки?
Денніс

При цьому в якості назв стовпців будуть використовувати клавіші dict. Як встановити клавіші для індексації?
mingchau

@DaveKielpinski Будь ласка, перевірте, чи ви передали список методу "from_records"; інакше це не працюватиме, і ви отримаєте те саме повідомлення про помилку, що і під час виклику DataFrame у словнику.
Майран

55

Спочатку потрібно створити серію панд. Другий крок - перетворення рядів панд у рамки даних панди.

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

Можна навіть вказати назву стовпця.

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

1
Це працювало для мене. Мій словник мав цілі клавіші та ndarray значення.
StatsSorceress

pd.Series(data).to_frame('ColumnName')коротше, хоча цей еквівалент, можливо, є більш прямим:pd.DataFrame.from_dict(data, orient='index', columns=['ColumnName'])
Alex F

29

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

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

pd.DataFrame([my_dict])

   A  B
0  1  2

8

Можливо, Series надасть усі необхідні функції:

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

DataFrame можна розглядати як колекцію серій, отже, ви можете:

  • Об'єднайте кілька серій в один кадр даних (як описано тут )

  • Додайте змінну Series в існуючий кадр даних ( приклад тут )


7

Вам потрібно надати ітерабелі як значення для стовпців Pandas DataFrame:

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

6

У мене була така ж проблема з нумеровими масивами, і рішення полягає в їх згладженні:

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

df = pd.DataFrame(data)

3

Якщо ви маєте намір перетворити словник скалярів, ви повинні включити індекс:

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)

3

Ви можете спробувати:

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

З документації на аргумент «орієнтуватися»: Якщо ключами прийнятого дикта повинні бути стовпці отриманого DataFrame, передайте «стовпці» (за замовчуванням). В іншому випадку, якщо ключі повинні бути рядками, передайте «індекс».


Будь ласка, використовуйте інструменти форматування для правильного редагування та форматування свого питання / відповіді. Коди в рамках пропозицій повинні бути відформатовані як code дуже важливі слова , щоб бути сміливим , менші важливі унції Курсив також використовувати списки при необхідності
Морс

Це не вирішує поставлене запитання, воно дає інший результат, ніж бажано.
Кен Вільямс

3

Панда магія на роботі. Вся логіка вийшла.

Повідомлення про помилку "ValueError: If using all scalar values, you must pass an index"говорить, що ви повинні пройти індекс.

Це не обов'язково означає, що передача індексу змушує панди робити те, що ви хочете

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

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, хоча.

Я б рекомендував завжди створювати словник списків конструктору фреймів даних при створенні фреймів даних. Простіше читати іншим розробникам. У Pandas є багато застережень, не змушуйте інших розробників доводитись до експертів з усіх них, щоб прочитати ваш код.


3

вхід не повинен бути списком записів - це може бути і один словник:

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

2

Це тому, що DataFrame має два інтуїтивно зрозумілих виміри - стовпці та рядки.

Ви вказуєте стовпці лише за допомогою словникових клавіш.

Якщо ви хочете вказати лише одновимірні дані, використовуйте серію!


0

Перетворити словник у кадр даних

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

Дайте нове ім’я Колонці

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

-2

Якщо у вас є словник, ви можете перетворити його в кадр даних панди з наступним рядком коду:

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

Це працює, але IMHO не має особливого сенсу <code> `<! - мова: lang-py -> фрукти_count = за замовчуванням (int )ruit_count [" яблука "] = 10ruit_count [" банани "] = 21 pd.DataFrame ({"ключ": fruit_count.keys (), "значення" :ruit_count.values ​​()}) Вихід: ключове значення 0 (банани, яблука) (21, 10) 1 (банани, яблука) (21, 10) <code>
випромінювач

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.