Reshape Dataframe

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
horstel_horst
User
Beiträge: 18
Registriert: Montag 27. September 2021, 19:09

Ich möchte einen Pandas DF tranformieren, so sieht der DF aus:

Code: Alles auswählen

import pandas as pd
ids = ['1','1','1','2','2','3','3']
lang = ['de','de','de','fr','fr','ch','ch']
value = ['de_1','de_2','de_3','fr_1','fr_2','ch_2','ch_3']
df = pd.DataFrame({
    'ids':ids,
    'lang':lang,
    'value':value})
Ziel ist folgender DF:

Code: Alles auswählen

ids = ['1','2','3']
value_de = ['de_1','de_2','de_3']
value_fr = ['fr_1','fr_2','']
value_ch = ['','ch_2','ch_3']
new_df = pd.DataFrame({
    'ids':ids,
    'value_de' : value_de,
    'value_fr' : value_fr,
    'value_ch' : value_ch
})
Ich hab es mit pivot, groupby etc. versucht, bin aber nicht zum Ziel gekommen.

Hat jemand eine Lösung parat?
LukeNukem
User
Beiträge: 232
Registriert: Mittwoch 19. Mai 2021, 03:40

horstel_horst hat geschrieben: Montag 7. Februar 2022, 14:35 Ich möchte einen Pandas DF tranformieren, so sieht der DF aus:

Code: Alles auswählen

ids = ['1','1','1','2','2','3','3']
lang = ['de','de','de','fr','fr','ch','ch']
value = ['de_1','de_2','de_3','fr_1','fr_2','ch_2','ch_3']

[...] 

[code]ids = ['1','2','3']
value_de = ['de_1','de_2','de_3']
value_fr = ['fr_1','fr_2','']
value_ch = ['','ch_2','ch_3']
Ich hab es mit pivot, groupby etc. versucht, bin aber nicht zum Ziel gekommen.

Hat jemand eine Lösung parat?
Wie soll das gehen? Python ist eine Programmiersprache und kann viele erstaunliche Dinge, aber wahrsagen kann es meines Wissens noch nicht. Und ohne diese Fähigkeit stellt sich die Frage, woher sollte der Interpreter denn sonst wissen soll, ob der leere String an die Liste angehängt werden soll, wie in "value_fr", oder ob er vorangestellt werden soll, wie in "value_ch"?
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

Also *eine* Gesetzmäßigkeit um von den Ausgangswerten auf die Zielwerte zu kommen, lässt sich relativ leicht ableiten.
Da man aber gar nichts über die Daten weiß, ist nicht klar, ob diese dann allgemeingültig ist.

Code: Alles auswählen

import pandas as pd

ids = ["1", "1", "1", "2", "2", "3", "3"]
lang = ["de", "de", "de", "fr", "fr", "ch", "ch"]
value = ["de_1", "de_2", "de_3", "fr_1", "fr_2", "ch_2", "ch_3"]

new_ids =sorted(set(ids))
value_de = [val if val in value else "" for val in (f"de_{num}" for num in new_ids)]
value_fr = [val if val in value else "" for val in (f"fr_{num}" for num in new_ids)]
value_ch = [val if val in value else "" for val in (f"ch_{num}" for num in new_ids)]

print(new_ids)
print(value_de)
print(value_fr)
print(value_ch)

"""
['1', '2', '3']
['de_1', 'de_2', 'de_3']
['fr_1', 'fr_2', '']
['', 'ch_2', 'ch_3']
"""
Antworten