Das Konstruieren von Pandas DataFrame aus Werten in Variablen ergibt "ValueError: Wenn Sie alle Skalarwerte verwenden, müssen Sie einen Index übergeben".


370

Dies mag eine einfache Frage sein, aber ich kann nicht herausfinden, wie das geht. Nehmen wir an, ich habe zwei Variablen wie folgt.

a = 2
b = 3

Ich möchte daraus einen DataFrame erstellen:

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

Dies erzeugt einen Fehler:

ValueError: Wenn Sie alle Skalarwerte verwenden, müssen Sie einen Index übergeben

Ich habe das auch versucht:

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

Dies gibt die gleiche Fehlermeldung.

Antworten:


571

Die Fehlermeldung besagt, dass Sie einen Index übergeben müssen, wenn Sie Skalarwerte übergeben. Sie können also entweder keine Skalarwerte für die Spalten verwenden - z. B. eine Liste:

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

oder verwenden Sie skalare Werte und übergeben Sie einen Index:

>>> df = pd.DataFrame({'A': a, 'B': b}, index=[0])
>>> df
   A  B
0  2  3

7
Möglicherweise liegt es daran, dass die Reihenfolge der Elemente in einer Liste in Python dauerhaft ist, während dies bei der Reihenfolge der Elemente in einem Wörterbuch nicht der Fall ist. Sie können einen DataFrame mit einem leeren Wörterbuch instanziieren. Im Prinzip würde ich annehmen, dass ein einzeiliger DataFrame, wie hier gezeigt, auch aus einem Wörterbuch erstellt werden kann, da die Reihenfolge keine Rolle spielt (dies wurde jedoch nicht implementiert). Bei mehreren Zeilen wäre Pandas jedoch nicht in der Lage, einen DataFrame zu erstellen, da er nicht weiß, welche Elemente zu derselben Zeile gehören.
Alexander

2
@VitalyIsaev - In diesem Fall hat die Datenrahmenzeile (dargestellt durch das angegebene Wörterbuch) keinen Index (nicht einmal einen impliziten). Eine einfache Lösung besteht darin, das Wörterbuch in eine Liste einzuschließen, die eine "natürliche Indizierung" aufweist. Man kann behaupten, wenn nur ein Wörterbuch angegeben ist (ohne eine Wrapping-Liste), dann nehmen Sie an index=0, aber das kann zu versehentlichem Missbrauch führen (wenn man denkt, dass ein einzelnes Wörterbuch irgendwie einen mehrzeiligen Datenrahmen erstellen kann)
Ori

Mehrere Lösungen in diesem Link eulertech.wordpress.com/2017/11/28/…
Jason Goal

Der Grund dafür ist, dass DataFrames zweidimensionale Daten enthalten sollen (dh Zeilen der beiden Variablen von OP). Wenn Sie einfach Index -> Wertepaare (wie ein Wörterbuch) halten möchten, sollten Sie eine Reihe verwenden, wie Rob vorschlägt.
Danuker

Dies ist ein einzelner Beispiel- / Zeilendatenrahmen, daher ist index = [0] logisch sinnvoll. Sie können es aber auch so manipulieren, dass es index = [100] ist, was funktioniert. F: Soll Index nicht logisch inkrementell geordnet werden, warum erlaubt Python die Indexmanipulation?
Sumanth Lazarus

65

Sie können auch pd.DataFrame.from_recordsFolgendes verwenden, wenn Sie das Wörterbuch bereits zur Hand haben:

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

Sie können den Index auch festlegen, wenn Sie möchten:

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

27
Diese Antwort funktioniert bei mir nicht. Bei Verwendung von from_records wird dieselbe Fehlermeldung angezeigt.
Dave Kielpinski

Dave, hast du den Code ausprobiert (definiere natürlich a und b)? Erhalten Sie immer noch eine Fehlermeldung? Kannst du posten?
FAX

12
@ DaveKielpinski Hast du vielleicht vergessen, die Klammern hinzuzufügen?
Dennis

Dadurch werden die Diktatschlüssel als Spaltennamen verwendet. Wie setze ich die Schlüssel auf Index?
Mingchau

@ DaveKielpinski Bitte überprüfen Sie, ob Sie eine Liste an die Methode "from_records" übergeben haben. Andernfalls funktioniert es nicht und Sie erhalten dieselbe Fehlermeldung wie beim Aufrufen von DataFrame im Wörterbuch.
Mairan

55

Sie müssen zuerst eine Pandas-Serie erstellen. Der zweite Schritt besteht darin, die Pandas-Serie in einen Pandas-Datenrahmen zu konvertieren.

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

Sie können sogar einen Spaltennamen angeben.

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

1
Das hat bei mir funktioniert. Mein Wörterbuch hatte Ganzzahlschlüssel und Ndarray-Werte.
StatsSorceress

pd.Series(data).to_frame('ColumnName')ist kürzer, obwohl dieses Äquivalent vielleicht direkter ist:pd.DataFrame.from_dict(data, orient='index', columns=['ColumnName'])
Alex F

29

Sie können versuchen, Ihr Wörterbuch in eine Liste einzuschließen

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

pd.DataFrame([my_dict])

   A  B
0  1  2

8

Vielleicht bietet Series alle Funktionen, die Sie benötigen:

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

DataFrame kann als eine Sammlung von Serien betrachtet werden, daher können Sie:

  • Verketten Sie mehrere Serien zu einem Datenrahmen (wie hier beschrieben ).

  • Fügen Sie dem vorhandenen Datenrahmen eine Serienvariable hinzu ( Beispiel hier )


7

Sie müssen iterables als Werte für die Pandas DataFrame-Spalten angeben:

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

6

Ich hatte das gleiche Problem mit Numpy-Arrays und die Lösung besteht darin, sie zu reduzieren:

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

df = pd.DataFrame(data)

3

Wenn Sie ein Skalarwörterbuch konvertieren möchten, müssen Sie einen Index einfügen:

import pandas as pd

alphabets = {'A': 'a', 'B': 'b'}
index = [0]
alphabets_df = pd.DataFrame(alphabets, index=index)
print(alphabets_df)

Obwohl für ein Listenwörterbuch kein Index erforderlich ist, kann dieselbe Idee auf ein Listenwörterbuch erweitert werden:

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)

Natürlich können Sie für das Listenwörterbuch den Datenrahmen ohne Index erstellen:

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

3

Du könntest es versuchen:

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

Aus der Dokumentation zum Argument 'orient': Wenn die Schlüssel des übergebenen Diktats die Spalten des resultierenden DataFrame sein sollen, übergeben Sie 'Spalten' (Standard). Andernfalls, wenn die Schlüssel Zeilen sein sollten, übergeben Sie 'index'.


Bitte verwenden Sie Formatierungswerkzeuge, um Ihre Frage / Antwort richtig zu bearbeiten und zu formatieren. Codes in Sätzen sind als code sehr wichtige Wörter zu formatieren , die fett und weniger wichtig sind. Kursivschrift Verwenden Sie bei Bedarf auch Listen
Morse

Dies löst die gestellte Frage nicht, sondern führt zu einem anderen Ergebnis als gewünscht.
Ken Williams

3

Pandas Magie bei der Arbeit. Alle Logik ist aus.

Die Fehlermeldung besagt, "ValueError: If using all scalar values, you must pass an index"dass Sie einen Index übergeben müssen.

Dies bedeutet nicht unbedingt, dass Pandas durch das Übergeben eines Index das tun, was Sie möchten

Wenn Sie einen Index übergeben, behandeln Pandas Ihre Wörterbuchschlüssel als Spaltennamen und die Werte als das, was die Spalte für jeden der Werte im Index enthalten sollte.

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

    A   B
1   2   3

Übergeben eines größeren Index:

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

Ein Index wird normalerweise automatisch von einem Datenrahmen generiert, wenn keiner angegeben wird. Pandas weiß jedoch nicht, wie viele Zeilen 2und 3Sie möchten. Sie können jedoch expliziter darauf eingehen

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

    A   B
0   2   3
1   2   3
2   2   3
3   2   3

Der Standardindex basiert jedoch auf 0.

Ich würde empfehlen, beim Erstellen von Datenrahmen immer ein Listenwörterbuch an den Datenrahmenkonstruktor zu übergeben. Für andere Entwickler ist es einfacher zu lesen. Pandas hat viele Vorbehalte. Lassen Sie andere Entwickler nicht zu Experten werden, um Ihren Code zu lesen.


3

Die Eingabe muss keine Liste von Datensätzen sein - es kann sich auch um ein einzelnes Wörterbuch handeln:

pd.DataFrame.from_records({'a':1,'b':2}, index=[0])
   a  b
0  1  2

Welches scheint gleichbedeutend zu sein mit:

pd.DataFrame({'a':1,'b':2}, index=[0])
   a  b
0  1  2

2

Dies liegt daran, dass ein DataFrame zwei intuitive Dimensionen hat - die Spalten und die Zeilen.

Sie geben die Spalten nur mit den Wörterbuchschlüsseln an.

Wenn Sie nur eindimensionale Daten angeben möchten, verwenden Sie eine Serie!


0

Wörterbuch in Datenrahmen konvertieren

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

Geben Sie der Spalte einen neuen Namen

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

-2

Wenn Sie ein Wörterbuch haben, können Sie es mit der folgenden Codezeile in einen Pandas-Datenrahmen verwandeln:

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

Es funktioniert, aber meiner Meinung nach macht es nicht viel Sinn. <Code> `<! - Sprache: lang-py -> Früchte_Zahl = defaultdict (int) Früchte_Zahl [" Äpfel "] = 10 Früchte_Zahl [" Bananen "] = 21 pd.DataFrame ({"Schlüssel" :ruit_count.keys (), "Wert": obst_count.values ​​()}) Out: Schlüsselwert 0 (Bananen, Äpfel) (21, 10) 1 (Bananen, Äpfel) (21, 10) <code>
Emiter

-3

Geben Sie das Diktat einfach auf eine Liste:

a = 2
b = 3
df2 = pd.DataFrame([{'A':a,'B':b}])
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.