if Befehl

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
Acid700
User
Beiträge: 8
Registriert: Montag 1. März 2021, 17:06

Hallo,

ich bin blutiger Anfänger und muss fürs Studium eine Datei statistisch auswerten.
Ich will eine Hypothese bestätigen bzw. widerlegen und dafür einen bestimmten Wert (hier "15") aus einer Spalte auslesen und über "i" anzeigen lassen wie oft dieser Wert vorkommt.
Das prozedere muss ich dann noch bei ein paar anderen Werten wiederholen, aber wenn man da prinzip verstanden hat klappt es ja.

Mein bisheriger Code sieht so aus, jedoch kommt beim print befehl nichts raus.

import csv


with open('Datensatz1.2.csv', 'r') as csvfile:
readCSV = csv.reader(csvfile, delimiter=";")

i = 0 # Linke
j = 0 # AfD
k = 0 # Sorgen Linke
l = 0 # Sorgen Afd


for row in readCSV:
if (row[1])== 15:
i +=1
print(i)

Wie kann ich die Werte auslesen und mir über print(i) anzeigen lassen wie oft sie vorkommen?
Benutzeravatar
__blackjack__
User
Beiträge: 13930
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Acid700: Beim öffnen der Datei fehlt das `newline`-Argument. Siehe Dokumentation vom `csv`-Modul.

Gewöhn Dir so schlechte Namen am besten gar nicht erst an. Wenn die nicht so nichtsagend wären, bräuchtest Du keine Kommentare um dem Leser zu vermitteln was sie bedeuten. Bei `i`, `j`, und `k` vermutet man Werte die als Index verwendet werden. Und `l` ist ein besonders schlechter Name, weil `l` in vielen Schriftarten `1` und `I` *sehr* ähnlich sieht.

`readCSV` ist kein guter Name für einen passiven Wert, denn Tätigkeiten als Namen bedeuten in der Regel das man eine Funktion vor sich hat.

Die Elemente von `row` sind Zeichenketten. Und eine Zeichenkette ist niemals gleich einer ganzen Zahl:

Code: Alles auswählen

In [311]: "15" == 15                                                            
Out[311]: False
Wenn Du das Ergebnis von ``row[1]`` in eine ganze Zahl umwandelst, dann sind die runden Klammern dort auch nicht so überflüssig wenn Du sie für den `int()`-Aufruf verwendest.

Einrückung ist in Python wichtig. Die ist ja nicht mal im Quelltext von Deinem Beitrag erhalten geblieben, so dass die Code-Tags des Forums nicht mal etwas genutzt hätten. Bitte Quelltext mit Einrückung und in Code-Tags in den Beitrag schreiben.

Code: Alles auswählen

#!/usr/bin/env python3
import csv


def main():
    with open("Datensatz1.2.csv", "r", encoding="utf-8", newline="") as file:
        anzahl_linke = sum(
            int(row[1]) == 15 for row in csv.reader(file, delimiter=";")
        )

    print(anzahl_linke)


if __name__ == "__main__":
    main()
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
Acid700
User
Beiträge: 8
Registriert: Montag 1. März 2021, 17:06

das ist die überarbeitete Version soweit ich dien Tipps verstanden habe. Wie gesagt hab wirklich kaum ahnung und weiß teilweise nicht was gemient ist.

Code: Alles auswählen

print("Deine Hypothsen lauten:")
print("1. Personen, welche als Parteipräferenz die Linke gewählt haben machen sich weniger Sorgen über die Zuwanderung von Flüchtlingen, als Personen die die AfD gewählt haben")
print("2. Männer machen sich mehr Sorgen über die Zuwanderung von Flüchtlingen als Frauen")
print("3. Männer verdienen mehr Geld als Frauen")

import csv

    

with open('Datensatz1.2.1.csv', 'r') as csvfile:
    daten = csv.reader(csvfile, delimiter=";")


    Linke = 0 # Linke
    Afd = 0 # Rechte
    SorgenLinke = 0 # Sorgen Linke
    SorgenAfD = 0 # Sorgen Rechte
    Männer = 0 # Männer
    Frauen = 0 # Frauen
    SorgenMänner = 0 # Sorgen Männer
    SorgenFrauen = 0 # Sorgen Frauen
    VerdienstMänner = 0 # Verdienst Männer
    VerdienstFrauen = 0 # Verdienst Frauen 

    # Linke machen sich mehr Sorgen als Rechte

    
    
    for row in daten:
        
        if (row[1]) == '15':
            Linke = Linke + 1
            SorgenLinke = SorgenLinke + (row[2])
            
        if (row[1]) == '25':
            AfD = AfD + 1
            SorgenAfD = SorgenAfD + (row[2])
        
    if SorgenLinke >= SorgenAfD:
        print("Hypothese 1 widerlegt!")
    else:
        print("Hypothese 1 trifft zu!")

    #Männer machen sich mehr Sorgen als Frauen & Männer verdienen mehr Geld als Frauen 

    for line in daten:
        if (row[0]) == '1':
            Männer = Männer + 1
            SorgenMänner = SorgenMänner + line[2]
            VerdienstMänner = VerdienstMänner + line[3]
        if (row[0]) == '2':
            Frauen = Frauen + 1
            SorgenFrauen = SorgenFrauen + line[2]
            VerdienstFrauen = VerdienstFrauen + line[3]
    if SorgenMänner >= SorgenFrauen:
        print("Hypothese 2 trifft zu!")
    else:
        print("Hypothese 2 widerlegt!")
    if VerdienstMänner >= VerdienstFrauen:
        print("Hypothese 3 trifft zu!")
    else:
        print("Hypothese3  widerlegt!")
Ich habe den code nach bestem wissen erweitert, jedoch habe ich nicht ganz verstanden, wie ich mir das Ergebnis von row[] als ganze zahl anzeigen lassen kann.
Sirius3
User
Beiträge: 18225
Registriert: Sonntag 21. Oktober 2012, 17:20

Warum steht in der ersten for-Schleife `for row in daten` und in der zweiten `for line in daten` und nutzt trotzdem row?
Wenn in der ersten Spalte ein String steht, warum denkst Du Du könntest in der zweiten und dritten Spalte so tun, als hättest Du Zahlen?

Warum verwendest Du nicht pandas?
Benutzeravatar
__blackjack__
User
Beiträge: 13930
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Ich würde auch auf Pandas setzten.

Und die Summen zu vergleichen ist komisch bis unsinnig. Da will man wohl eher das artithmetische Mittel oder den Median zum Vergleich heranziehen.
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
Antworten