DataFrame Spaltenbeschriftung aus weiterem DataFrame übernehmen

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
sandrosute
User
Beiträge: 4
Registriert: Samstag 27. April 2019, 16:14

Hallo,

ich habe ein pandas Dataframe mit mehreren Spalten. Aus einer Spalte davon erzeuge ich ein separates DF und entferne doppelte Einträge. Dies Einträge möchte ich als Spaltenbeschriftungen in einem neuen Dataframe benutzen weil ich dazu Einträge zuordnen möchte. Leider bekomme ich die Übernahme der Spaltenbeschriftungen nicht richtig hin. Hat jemand eine Idee wie ich das Problem lösen könnte?

Hier der Beispielhafte Code für mein Problem.

Code: Alles auswählen

import pandas as pd
import numpy as np

DF_Spaltenbeschriftung=pd.DataFrame({})
DF_Spaltenbeschriftung.loc[0, '136'] = '1'
DF_Spaltenbeschriftung.loc[1, '136'] = '123'
DF_Spaltenbeschriftung.loc[2, '136'] = '456'

DF_Spaltenbeschriftung.to_records(index=False)
print(DF_Spaltenbeschriftung)


DF_Werteliste = pd.DataFrame({}, columns=DF_Spaltenbeschriftung)
DF_Werteliste.loc[0, 456] = 1
print(DF_Werteliste)
als Ergebnis erscheint:

Code: Alles auswählen

   136
0    1
1  123
2  456
  (1,) (123,) (456,)  456
0  NaN    NaN    NaN  1.0
Danke für eure Mühen

sandrosute
Benutzeravatar
__blackjack__
User
Beiträge: 14044
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@sandrosute: Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase).

Numpy wird importiert aber gar nicht verwendet.

Die Zeile mit dem `to_records()`-Aufruf ist komplett sinnfrei, weil mit dem Ergebnis dann ja gar nichts gemacht wird.

Beim Erstellen beider `DataFrame`-Objekte kann man sich das leere Wörterbuch sparen. Wobei man das erstellen beim ersten natürlich deutlich einfacher haben kann wenn man dort ein Wörterbuch mit den Daten übergibt.

Hier also erst einmal Dein Beispiel überarbeitet:

Code: Alles auswählen

#!/usr/bin/env python3
import pandas as pd


def main():
    spaltenbeschriftung_df = pd.DataFrame({"136": ["1", "123", "456"]})
    print(spaltenbeschriftung_df)

    werteliste_df = pd.DataFrame(columns=spaltenbeschriftung_df)
    werteliste_df.loc[0, 456] = 1
    print(werteliste_df)


if __name__ == "__main__":
    main()
Das erste Problem ist, das der `DataFrame` ja eine zweidimensionale Datenstruktur ist und Du anscheinend ja nur ganz normale Spalten haben willst, also eindimensionale. Der `DataFrame` lässt dich das trotzdem so machen, weil `DataFrame`-Objekte auch mehrstufige Indexe erlauben. Du willst aber nur die Daten in der "136"-Spalte als Spalten im zweiten `DataFrame` also darfst Du da für `columns` auch nur diese Spalte übergeben und nicht den gesamten `DataFrame`:

Code: Alles auswählen

#!/usr/bin/env python3
import pandas as pd


def main():
    spaltenbeschriftung_df = pd.DataFrame({"136": ["1", "123", "456"]})
    print(spaltenbeschriftung_df)

    werteliste_df = pd.DataFrame(columns=spaltenbeschriftung_df["136"])
    werteliste_df.loc[0, 456] = 1
    print(werteliste_df)


if __name__ == "__main__":
    main()
Ausgabe:

Code: Alles auswählen

   136
0    1
1  123
2  456
136    1  123  456  456
0    NaN  NaN  NaN  1.0
Schon etwas besser, aber jetzt gibt es zwei 456-Spalten. Also technisch ist das eine 456-Spalte und eine "456"-Spalte. Es gibt halt einen Unterschied zwischen einer Zahl und einer Zeichenkette die die Ziffern enthält. Das ist nicht das gleiche:

Code: Alles auswählen

In [178]: 456 == "456"                                                          
Out[178]: False
Also hier die Endfassung:

Code: Alles auswählen

#!/usr/bin/env python3
import pandas as pd


def main():
    spaltenbeschriftung_df = pd.DataFrame({"136": ["1", "123", "456"]})
    print(spaltenbeschriftung_df)

    werteliste_df = pd.DataFrame(columns=spaltenbeschriftung_df["136"])
    werteliste_df.loc[0, "456"] = 1
    print(werteliste_df)


if __name__ == "__main__":
    main()
Ausgabe:

Code: Alles auswählen

   136
0    1
1  123
2  456
136    1  123 456
0    NaN  NaN   1
Wobei das ein bisschen komisch aussieht. Sicher, dass das ein `DataFrame` sein muss? Das sieht irgendwie mehr nach einem Wörterbuch aus. Das erste vielleicht auch schon, denn zumindest in diesem Beispiel wird mit den `DataFrame`-Objekten nichts gemacht wofür man `DataFrame`-Objekte brauchen würde.

Code: Alles auswählen

#!/usr/bin/env python3


def main():
    spaltenbeschriftung = {"136": ["1", "123", "456"]}
    print(spaltenbeschriftung)

    werteliste = dict.fromkeys(spaltenbeschriftung["136"])
    werteliste["456"] = 1
    print(werteliste)


if __name__ == "__main__":
    main()
Ausgabe:

Code: Alles auswählen

{'136': ['1', '123', '456']}
{'1': None, '123': None, '456': 1}
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
sandrosute
User
Beiträge: 4
Registriert: Samstag 27. April 2019, 16:14

@__blackjack__,

danke für deinen Kommentar.
Das Beispiel soll nur mein Problem beschreiben. Ich bin mir aber bewusst, das ich noch nicht so ganz genau die Unterschiede der einzelnen ein- und mehrdimensionalen Datenstrukturen verinnerlicht habe.
Ursprünglich stammen die benötigten Spaltennamen aus einem CSV Import mit Pandas aus allen Zeilen einer bestimmten Spalte die ich noch aufbereite. Da sich gelegentlich die Inhalte etwas verändern will ich das erst zur Laufzeit festlegen. Danach erst wird ein neues zweidimensionales DF aufgebaut, weil ich noch aus der Original CSV, aus noch anderen Kriterien bedingte Summen bilden muss, um diese den Spaltenkategorien in verschiedene Zeilen zuordnen zu können. Also letztendlich ist das Endergebnis wieder zweidimensional.
Da deine Endfassung vermutlich dem enstpricht was ich zur weiteren Bearbeitung benötige, kann ich erst mal weiter machen.

Danke dafür.
Antworten