it-swarm.com.de

Das Konstruieren von pandas DataFrame aus Werten in Variablen gibt "ValueError: Wenn Sie alle skalaren Werte verwenden, müssen Sie einen Index übergeben".

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

a = 2
b = 3

Ich möchte einen DataFrame daraus erstellen:

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

Dies erzeugt einen Fehler:

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

Das habe ich auch versucht:

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

Dies gibt die gleiche Fehlermeldung.

261

Die Fehlermeldung besagt, dass Sie einen Index übergeben müssen, wenn Sie skalare Werte übergeben. Sie können also entweder keine skalaren Werte für die Spalten verwenden - z. benutze 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
400
DSM

Sie können auch pd.DataFrame.from_records verwenden, was bequemer ist, wenn Sie das Wörterbuch bereits zur Hand haben:

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

Sie können den Index auch wie folgt festlegen:

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

Sie müssen zuerst eine pandas -Reihe erstellen. Der zweite Schritt besteht darin, die pandas -Reihe in 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')
39
MLguy

Sie können versuchen, Ihr Wörterbuch in eine Liste zu packen

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

pd.DataFrame([my_dict])

   A  B
0  1  2
17
NewBie

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

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

Vielleicht bietet die Serie 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 beschrieben hier )

  • Fügen Sie eine Serienvariable in einen vorhandenen Datenrahmen ein ( Beispiel hier )

6
Rob

Ich hatte das gleiche Problem mit numpy Arrays und die Lösung ist, sie zu verflachen:

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

df = pd.DataFrame(data)
4
MicheleDIncecco

Du könntest es versuchen:

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

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

4
Matthew Connell

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 Wörterbuch der Listen den Datenrahmen ohne Index erstellen:

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

Pandas Magie bei der Arbeit. Alle Logik ist aus.

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

Dies bedeutet nicht zwangsläufig, dass durch die Übergabe eines Index pandas do was Sie möchten

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

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

    A   B
1   2   3

Einen größeren Index übergeben:

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 ist. Allerdings weiß pandas nicht, wie viele Zeilen von 2 und 3 Sie möchten. Sie können jedoch genauer 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 ist jedoch 0 basierend.

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 eine Menge Vorbehalte, machen Sie andere Entwickler nicht zu Experten, um Ihren Code zu lesen.

2
firelynx

Dies liegt daran, dass ein DataFrame zwei intuitive Dimensionen hat - die Spalten nd 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!

2
danuker

Dies ist ein Kommentar zur Antwort von @fAx: 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
1
S.V

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']
0
kamran kausar

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

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