Wie formatiere ich eine csv Datei mit Python?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
PythonNeuling2
User
Beiträge: 8
Registriert: Mittwoch 4. Mai 2022, 15:07

Hi,

ich habe eine Übungsaufgabe für Python bekommen. Bin noch Neuling.

Wir arbeiten mit Jupyter Notebook und pandas. Zusätzlich haben wir eine csv Datei, die wir in Excel sehen können.

Dort stehen in Zeile 1 (Beginnend bei Spalte A bis Spalte E) Mitarbeiternamen.
In Zeile 2 stehen Wochentage.
In Zeile 3 wöchentlich oder 2-wöchentlich.
In Zeile 4 Schichtbeginn (Uhrzeit).
In Zeile 5 Schichtende (Uhrzeit).
In Zeile 6 die Abteilung.

Eine Spalte enthält immer alle Informationen für einen Mitarbeiter.

Aufgabe ist nun ein Programm zu erstellen, das für jeden Mitarbeiter die Infos in folgendem Format ausgibt:

Der Mitarbeiter Tom (Name steht in A1)
arbeitet immer am Dienstag (Tag steht in B1).
Der Mitarbeiter arbeitet dabei wöch. in der Zeit von 10 Uhr (C1) bis 14 Uhr (D1).
Der Mitarbeiter Tom
arbeitet in der Abteilung Vertrieb (E1).

Folgende Ideen habe ich bisher:

import pandas as pd
mitarbeiter = pd.read_csv("mitarbeiterinfos.csv", sep=';', decimal=",", header=None)

wenn ich print(mitarbeiter) angebe, erhalte ich folgendes:

0 1 \
0 Tom Tim
1 Dienstag Donnerstag
2 wöch. 14-tägl.
3 10 Uhr 12 Uhr
4 14 Uhr 16 Uhr
5 Personal Marketing

2 \
0 Mohammed
1 Dienstag
2 wöch.
3 12 Uhr
4 14 Uhr
5 Vertrieb

3 \
0 Maximilian
1 Donnerstag
2 14-tägl.
3 10 Uhr
4 16 Uhr
5 Controlling

4 5
0 Maria Isabella
1 Mittwoch Donnerstag
2 wöch. wöch
3 10 Uhr 12 Uhr
4 14 Uhr 18 Uhr
5 Einkauf Marketing


Ich müsste den Text ja jeweils in " " setzen. Also irgendwie so: print("Der Mitarbeiter" "arbeitet immer am"...), aber wie kann ich auf die Werte in den jeweiligen Zellen verweisen? Da tue ich mich aktuell sehr schwer mit. Hoffe jemand kann mir helfen
LukeNukem
User
Beiträge: 232
Registriert: Mittwoch 19. Mai 2021, 03:40

PythonNeuling2 hat geschrieben: Donnerstag 5. Mai 2022, 20:59 ich habe eine Übungsaufgabe für Python bekommen. Bin noch Neuling.
Ich würde mal vermuten, daß es hier um Listen (siehe hier [1] und hier [2]) und die For-Schleife (siehe hier [3]) geht.

[1] https://docs.python.org/3/tutorial/intr ... html#lists
[2] https://docs.python.org/3/tutorial/datastructures.html
[3] https://docs.python.org/3/tutorial/cont ... statements
Benutzeravatar
__blackjack__
User
Beiträge: 13117
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@PythonNeuling2: f-Zeichenkettenliterale und die `format()`-Methode auf Zeichenketten wären auch interessante Themen. Und neben den Python-Grundlagen solltest Du Dich auch mit den Pandas-Grundlagen beschäftigen.

Pandas hat eine recht ausführliche Dokumentation. Neben der API-Referenz gibt es Tutorials für Einsteiger und ein Benutzerhandbuch. Beim Benutzerhandbuch findet man schon recht am Anfang nach den Kapiteln „10 minutes to pandas“ (Überblick über Pandas) und „Intro to data structures“ (Einführung der beiden Hauptdatenstrukturen die Pandas bietet) in „Essential basic functionality“ unter anderem wie man über die Spalten (`Series`-Objekte) eines `DataFrame` iterieren kann.

Die `Series`-Objekte, also die einzelnen Spalten, sind iterierbar. das heisst auch, das man eine „iterable unpacking“-Zuweisung machen kann um die einzelnen Informationen leicht an sprechende Namen zu binden.

Code: Alles auswählen

In [139]: a, b, c = pd.Series(["a", "b", "c"])                                  

In [140]: a                                                                     
Out[140]: 'a'

In [141]: b                                                                     
Out[141]: 'b'

In [142]: c                                                                     
Out[142]: 'c'
Und diese Informationen kann man dann leicht mittels f-Zeichenkettenliteralen in den vorgegebenen Text hinein formatieren.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@LukeNukem: es geht um Pandas, und darum, dass man die Daten erst Transponieren muß, und dann den Spalten sinnvolle Namen geben sollte.
Dann kann man mit DataFrame.itertuples() jeden Datensatz durchgehen, und mit Format-Strings und einigen if-Abfragen die gewünschte Ausgabe hinformatieren.
Benutzeravatar
__blackjack__
User
Beiträge: 13117
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Sirius3: ``if``-Abfragen sehe ich nicht wirklich, es sei denn man will da irgendwie eine Heuristik für das Geschlecht einbauen, denn „Der Mitarbeiter Isabella arbeitet immer am Donnerstag.“ klingt ein bisschen schräg.

Und man kann auch über die Spalten iterieren.

@PythonNeuling2: Ich würde „Der Mitarbeiter“ aus dem Text entfernen und immer nur den Namen ausgeben lassen. Es sei denn das ist tatsächlich hart so vorgegeben, dann sähe die Ausgabe aber etwas komisch aus:

Code: Alles auswählen

Der Mitarbeiter Tom arbeitet immer am Dienstag.
Der Mitarbeiter arbeitet dabei wöch. in der Zeit von 10 Uhr bis 14 Uhr.
Der Mitarbeiter Tom arbeitet in der Abteilung Personal.

Der Mitarbeiter Tim arbeitet immer am Donnerstag.
Der Mitarbeiter arbeitet dabei 14-tägl. in der Zeit von 12 Uhr bis 16 Uhr.
Der Mitarbeiter Tim arbeitet in der Abteilung Marketing.

Der Mitarbeiter Mohammed arbeitet immer am Dienstag.
Der Mitarbeiter arbeitet dabei wöch. in der Zeit von 12 Uhr bis 14 Uhr.
Der Mitarbeiter Mohammed arbeitet in der Abteilung Vertrieb.

Der Mitarbeiter Maximilian arbeitet immer am Donnerstag.
Der Mitarbeiter arbeitet dabei 14-tägl. in der Zeit von 10 Uhr bis 16 Uhr.
Der Mitarbeiter Maximilian arbeitet in der Abteilung Controlling.

Der Mitarbeiter Maria arbeitet immer am Mittwoch.
Der Mitarbeiter arbeitet dabei wöch. in der Zeit von 10 Uhr bis 14 Uhr.
Der Mitarbeiter Maria arbeitet in der Abteilung Einkauf.

Der Mitarbeiter Isabella arbeitet immer am Donnerstag.
Der Mitarbeiter arbeitet dabei wöch in der Zeit von 12 Uhr bis 18 Uhr.
Der Mitarbeiter Isabella arbeitet in der Abteilung Marketing.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
PythonNeuling2
User
Beiträge: 8
Registriert: Mittwoch 4. Mai 2022, 15:07

__blackjack__ hat geschrieben: Freitag 6. Mai 2022, 13:40 Sirius3: ``if``-Abfragen sehe ich nicht wirklich, es sei denn man will da irgendwie eine Heuristik für das Geschlecht einbauen, denn „Der Mitarbeiter Isabella arbeitet immer am Donnerstag.“ klingt ein bisschen schräg.

Und man kann auch über die Spalten iterieren.

@PythonNeuling2: Ich würde „Der Mitarbeiter“ aus dem Text entfernen und immer nur den Namen ausgeben lassen. Es sei denn das ist tatsächlich hart so vorgegeben, dann sähe die Ausgabe aber etwas komisch aus:

Code: Alles auswählen

Der Mitarbeiter Tom arbeitet immer am Dienstag.
Der Mitarbeiter arbeitet dabei wöch. in der Zeit von 10 Uhr bis 14 Uhr.
Der Mitarbeiter Tom arbeitet in der Abteilung Personal.

Der Mitarbeiter Tim arbeitet immer am Donnerstag.
Der Mitarbeiter arbeitet dabei 14-tägl. in der Zeit von 12 Uhr bis 16 Uhr.
Der Mitarbeiter Tim arbeitet in der Abteilung Marketing.

Der Mitarbeiter Mohammed arbeitet immer am Dienstag.
Der Mitarbeiter arbeitet dabei wöch. in der Zeit von 12 Uhr bis 14 Uhr.
Der Mitarbeiter Mohammed arbeitet in der Abteilung Vertrieb.

Der Mitarbeiter Maximilian arbeitet immer am Donnerstag.
Der Mitarbeiter arbeitet dabei 14-tägl. in der Zeit von 10 Uhr bis 16 Uhr.
Der Mitarbeiter Maximilian arbeitet in der Abteilung Controlling.

Der Mitarbeiter Maria arbeitet immer am Mittwoch.
Der Mitarbeiter arbeitet dabei wöch. in der Zeit von 10 Uhr bis 14 Uhr.
Der Mitarbeiter Maria arbeitet in der Abteilung Einkauf.

Der Mitarbeiter Isabella arbeitet immer am Donnerstag.
Der Mitarbeiter arbeitet dabei wöch in der Zeit von 12 Uhr bis 18 Uhr.
Der Mitarbeiter Isabella arbeitet in der Abteilung Marketing.

Ja genauso soll es am Ende aussehen. Ich muss mich also mit for Schleifen und f-Zeichenkettenliteralen etwas genauer befassen. Das erste hatten wir schon mal grob besprochen, aber es ist wirklich alles neu für mich. Muss mir also nochmal paar Tutorials auf Youtube ansehen. Aber danke schonmal für die Infos. Dann weiß ich zumindest in welche Richtung ich schauen muss
PythonNeuling2
User
Beiträge: 8
Registriert: Mittwoch 4. Mai 2022, 15:07

Könnt ihr mir nochmal helfen? Ich habe leider absolut keinen Ansatz wie ich den Standardtext vor und nach jedem Mitarbeiter in Python integriere. Was wäre denn der erste Schritt, den ich machen müsste? Ich bin komplett überfordert. Vielleicht bin ich auch zu dumm dafür, aber ich verstehe es wirklich überhaupt nicht
Benutzeravatar
__blackjack__
User
Beiträge: 13117
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@PythonNeuling2: Dazu braucht man eigentlich nicht mehr als die `print()`-Funktion und f-Zeichenkettenliterale: https://docs.python.org/3.7/glossary.html#term-f-string

Von den Grundlagen solltest Du mindestens alles bis inklusive dem Kapitel über Datenstrukturen im Tutorial in der Python-Dokumentation durcharbeiten.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
PythonNeuling2
User
Beiträge: 8
Registriert: Mittwoch 4. Mai 2022, 15:07

__blackjack__ hat geschrieben: Sonntag 8. Mai 2022, 00:32 @PythonNeuling2: Dazu braucht man eigentlich nicht mehr als die `print()`-Funktion und f-Zeichenkettenliterale: https://docs.python.org/3.7/glossary.html#term-f-string

Von den Grundlagen solltest Du mindestens alles bis inklusive dem Kapitel über Datenstrukturen im Tutorial in der Python-Dokumentation durcharbeiten.
Alles klar, danke dir. Ich gebe ein leeres Blatt ab und schaue mir die Lösung dann nochmal an. So bekomme ich es leider nicht hin, bin zu dumm dafür
PythonNeuling2
User
Beiträge: 8
Registriert: Mittwoch 4. Mai 2022, 15:07

Nach bisschen rumprobieren, habe ich eine Lösung... ist der code so in ordnung?

for i in mitarbeiter:
mitarbeitername=mitarbeiterinfos.loc[0,i]
wochentag=mitarbeiterinfos.loc[1,i]
häufigkeit=mitarbeiterinfos.loc[2,i]
beginn=mitarbeiterinfos.loc[3,i]
ende=mitarbeiterinfos.loc[4,i]
abteilung=mitarbeiterinfos.loc[5,i]

print("Der Mitarbeiter {} \narbeitet immer am {}. \nDer Mitarbeiter arbeitet dabei {} in der Zeit von {} bis {}. \nDer Mitarbeiter {} \narbeitet in der Abteilung {}.\n".format(mitarbeitername,wochentag,häufigkeit,beginn,ende,mitarbeitername,abteilung))
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Bitte in Zukunft die Code-Tags benutzen, damit die in Python wichtigen Einrueckungen nicht verloren gehen.

Und das formatieren geht noch schoener, wenn du tatsaechliche f-Strings benutzen wuerdes.

Code: Alles auswählen

print(f"Der Mitarbeiter {mitarbeiter} ...")  # Wird aus den umgebenden Variablen einfach genutzt
PythonNeuling2
User
Beiträge: 8
Registriert: Mittwoch 4. Mai 2022, 15:07

dankeschön
Benutzeravatar
__blackjack__
User
Beiträge: 13117
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Mein Ansatz sähe so aus (mit Indexwerten zu arbeiten ist immer ein bisschen ”unpythonisch” IMHO):

Code: Alles auswählen

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


def main():
    data = pd.read_csv("test.csv", delimiter=";", header=None)
    for _, (
        name,
        day,
        period,
        start_time,
        end_time,
        department,
    ) in data.items():
        print(
            f"{name} arbeitet immer am {day}.\n"
            f"{name} arbeitet dabei {period} in der Zeit von {start_time}"
            f" bis {end_time}.\n"
            f"{name} arbeitet in der Abteilung {department}.\n"
        )


if __name__ == "__main__":
    main()
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten