Dataframe Auswerten

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
Evora
User
Beiträge: 8
Registriert: Mittwoch 16. Juni 2021, 10:47

Guten Tag,

ich bin neu hier und hoffe ich werd nicht gleich dafür gelüncht einfach mal nen neuen Beitrag auf zu machen :roll:
und ja ich bin auch was Python angeht absolut neu..

Ich versuche mich seit einiger Zeit an der Auswertung einer CSV Datei und komme leider nicht weiter. Zur Info ich arbeite auf Jupyter.
Ich habe nachgelesen wie man bestimmte Zeilen, Spalten, Zellen anspricht und ausgibt, ich habe funktionen wie count, count_values, unique, drop_duplicates, groupby, uvm ausprobiert.
Allerdings spricht das alles immer eine spalte an, bzw. wertet eine Spalte aus. Ich habe eine Umfrage mit 6 Spalten in denen die Zahlen von 1 - 5 enthalten sind. Ich würde gerne die 5er, die 4er, die 3er etc. aller Spalten Zählen und dann eine Ausgabe erzeugen die von den 6 Spalten nach häufigkeit sortiert ausgibt Spalte4: 12 x 5, Spalte1: 10 x 5 usw.
So das ich danach mit diesem ergebnis zum Beispiel einen Graph plotten kann der mir die Spalte mit den häufigsten 5er Werten bis zu der Spalte mit den wenigsten 5er werten angibt.

Ich hoffe das war verständlich.. ich habe mal einen kleinen DF erzeugt mit Zahlenwerten um das ganze zu testen..

Es reicht auch völlig mir vllt den Befehl von Pandas zu sagen ... ich weiß nur langsam nicht mehr wonach ich suchen soll :( Grundsätzlcih ist count_value ja ein toller Anfang ..aber funktioniert das auch Spaltenübergreifend und mit einem gewünschten inhalt?

df = pd.DataFrame({
'Wirtschaft':
[5,3,2,1,5],
'Finanzierung':
[2,3,5,5,5],
'Optik':
[1,2,4,3,5]
})
display(df)

Vielen Dank scho mal :oops:
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Evora: Suchst Du so etwas:

Code: Alles auswählen

In [30]: df                                                                     
Out[30]: 
   Wirtschaft  Finanzierung  Optik
0           5             2      1
1           3             3      2
2           2             5      4
3           1             5      3
4           5             5      5

In [31]: df.apply(pd.Series.value_counts)                                       
Out[31]: 
   Wirtschaft  Finanzierung  Optik
1         1.0           NaN      1
2         1.0           1.0      1
3         1.0           1.0      1
4         NaN           NaN      1
5         2.0           3.0      1
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Evora
User
Beiträge: 8
Registriert: Mittwoch 16. Juni 2021, 10:47

wenn ich das richtig sehe werden die Werte des gesamen Dataframes gezählt... das ist nicht das was ich suche.
Ich bekomm es so an meinem importieren auch leider nicht nachgestellt.

Ich habe ja eine csv Datei mit 91 Spalten, davon sollen 6 miteinander verglichen werden. Ich kann erstmal per value counts zwar zählen wie oft
5 gewählt wurde, allerdings müsste ich dann diese Zahl per ansprache der Zelle wieder raus nehmen. Ich wollte aber eig nicht jede Zelle einzeln ansprechen

example = df.["Wirtschaft"].value_counts().to_frame()
display(example)
Out:
Wirtschaft
5.0 2
1.0 1
2.0 1
3.0 1

und dann z.b mit erneuter ansprache
example["Wirtschaft"]5]

so würde ich im OUT ja die zwei Erhalten..
Das ist aber m.e. relativ umständlich, dass für jede Zahl von allen Spalten zu machen... gibt es da keinen "schönen" weg?
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Evora: Wenn das zählen nicht das ist was Du wolltest, dann verstehe ich nicht was Du willst. Du kannst da doch jetzt sehen welche Spalte die meisten 5er hat. Und um das zu sehen, muss man doch zählen. Und im ersten Beitrag steht doch „Ich würde gerne die 5er, die 4er, die 3er etc. aller Spalten Zählen“. Was hättest Du denn sonst darunter verstanden? Also wie würde das gewünschte Ergebnis denn konkret aussehen bei Dir?
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Evora
User
Beiträge: 8
Registriert: Mittwoch 16. Juni 2021, 10:47

Das Problem ist eher das der gesamte DF gezählt wird... kann auch an mir liegen weil ich es nicht angepasst bekomme, ich hab bislang nicht mit apply gearbeitet. Der eigentlich importierte DF hat über 90 spalten mit sehr unterschiedlichen Einträgen.

Ich habe jetzt einen Weg gefunden indem ich die Value_counts erneut zu einem DF zusammensetze, so bleiben mir im Grunde statt der über 90 spalten nur die benötigten. Diesen DF habe ich jetzt Transformiert somit sieht man von allen Fragen die Werte 5,0. Aber das ist halt alles relativ umständlich.. ich dachte evtl gibt es einen schönen weg den ich einfach noch nicht gefunden hab

Bild

und bei zweien passt das Format nicht weshalb mir die Inhalte gelöscht werden wenn ich die spalten ergänze :? aber ich werde mal versuchen die entsprechend anzupassen.
Evora
User
Beiträge: 8
Registriert: Mittwoch 16. Juni 2021, 10:47

Ich grabe jetzt nochmal meinen Beitrag aus, da ich immernoch an Dataframes arbeite und bei einer Sache erneut nicht weiterkomme..
Den Sachverhalt darüber habe ich inzwischen lösen können.

ABER ...

ich habe einen neuen DF bei dem ich zwei Spalten miteinander verrechnen muss und zwar einmal einen Winkel und einmal eine Fläche.
Das Problem ist, dass math.cos() keine dataframes, arrays, series verarbeitet sondern so wie ich es jetzt gelesen habe nur einzelne Zahlen.
Ich muss aber den cos bilden und die Zahl dann als Nenner mit der zugehörigen Zahl einer anderen Spalte verrechnen.

Rechnung: 1/ cos(df['wert1']) * df['wert2']

Der DF kann aber nicht eingelesen werden, fehler: "only length-1 arrays can be converted to Python scalars"

jetzt dachte ich mir vielleicht rechne ich jeden wert einzeln durch eine Schleife.. das funktioniert auch.. ich bekomme damit die Flächen die ich benötige.

Mein Problem ist jetzt, wie kann ich die ergebnisse wieder als DF Spalte zusammenführen um diese dann meinem DF hinzuzufügen? Ist das möglich mit einer Schleife oder muss man einen komplett anderen weg gehen?

while i < n:
number = 1/math.cos(math.radians(df['slope']))
print(df['area_area']*number)
i = i + 1
einfachTobi
User
Beiträge: 491
Registriert: Mittwoch 13. November 2019, 08:38

Du kannst die Numpy-Funktionen auf Vektoren anwenden (also z. B. eine DataFrame-Spalte).

Code: Alles auswählen

import numpy as np
# ...
df["cos_result"] = df["area_area"] / np.cos(np.deg2rad(df["slope"]))
Evora
User
Beiträge: 8
Registriert: Mittwoch 16. Juni 2021, 10:47

:shock: omg vielen Dank .. :oops:
Antworten