Panda ist Zeile NaN oder Nummer

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
ftiago
User
Beiträge: 5
Registriert: Samstag 9. Mai 2020, 15:07

Hallo ich hab eine Frag zu pandas

Ich würde gerne die Länge der Bauteile zusammenzählen das Funktioniert soweit auch.
Jedoch möchte ich mit einer If-Abfrage prüfen ob das Bauteil Isoliert ist oder nicht.

Code: Alles auswählen

import pandas as pd

#Datein einlesen
df = pd.read_excel('Bauteilliste.xlsx')

#Breiten anpassen damit alle Spalten auf Jupyter ersichtlich sind
pd.set_option('display.max_columns', 75)

#Filter Einstellung 
# 1. Alle Baute mit der Bezeichnung(KZ) = R-R und der Druchmesser der Bauteile = 160
filt = (df['KZ'] == 'R-R') & (df['D'] == 160)

#Um die Gesamtllänge der Bauteile zusammen zuzählen
counter_lenght = 0
counter_lenght_isolation = 0

#Mit einer For-Schleife durch die sortierte Liste 
for row in df.loc[filt, 'L']:

       # Wen in IsoOf = NaN dann      (Bauteil keine Isolation)
        #counter_lenght_isolation = counter_lenght_isolation + row
       #Sonst 
        #counter_lenght = counter_lenght + row

Bild
ftiago
User
Beiträge: 5
Registriert: Samstag 9. Mai 2020, 15:07

Wie muss ich machen das meine

Code: Alles auswählen

isnull().values.any()
mit der row mitgeht?
Momentan wird die nur dir row 0 von de Spalte IsoOf geprüft und nicht der gleiche Index wie der Ausgegebene Index

Code: Alles auswählen

import pandas as pd

#Datein einlesen
df = pd.read_excel('Bauteilliste.xlsx')

#Breiten anpassen damit alle Spalten auf Jupyter ersichtlich sind
pd.set_option('display.max_columns', 75)

#Filter Einstellung 
# 1. Alle Baute mit der Bezeichnung(KZ) = R-R und der Druchmesser der Bauteile = 160
filt = (df['KZ'] == 'R-R') & (df['D'] == 160)
#Um die Gesamtllänge der Bauteile zusammen zuzählen
counter_lenght = 0
counter_lenght_isolation = 0

for row in df.loc[filt, 'L']:
    if df.loc[filt, 'IsoOf'].isnull().values.any() == True:
        counter_lenght = counter_lenght + row
    else:
        counter_lenght_isolation = counter_lenght_isolation + row

print(counter_lenght)
print(counter_lenght_isolation)
ftiago
User
Beiträge: 5
Registriert: Samstag 9. Mai 2020, 15:07

Ich konnte das Problem Lösen.

Lösung: Anstatt mit .isnull zuarbeiten habe ich .isna() benutzt

Code: Alles auswählen

import pandas as pd


df = pd.read_excel('Bauteilliste.xlsx')

pd.set_option('display.max_columns', 75)

# Filter settings
filt_with_isolation = (df['KZ'] == 'R-R') & (df['D'] == 160) & (df['IsoOf'].isna() == False)
filt_without_isolation = (df['KZ'] == 'R-R') & (df['D'] == 160) & (df['IsoOf'].isna() == True)

# counting the meters
counter_with_isolation = 0
counter_without_isolation = 0 

# for-Slice, get Elements with isolation
for row in df.loc[filt_with_isolation, 'L']:
    counter_with_isolation = counter_with_isolation + row

for row in df.loc[filt_without_isolation, 'L']:
    counter_without_isolation = counter_without_isolation + row

print(counter_with_isolation)
print(counter_without_isolation)

Output:

6030.0
41050.0
einfachTobi
User
Beiträge: 512
Registriert: Mittwoch 13. November 2019, 08:38

Das was du da jetzt machst ist keine gute Lösung.
Zunächst hat du gar keinen `counter`, sondern die Summe. Ein Counter würde ja die Anzahl angeben. Aber viel wichtiger: Man iteriert nicht über DataFrames! Es gibt nahezu keinen Grund das zu tun und der Grund Pandas zu verwenden ist, um das zu vermeiden.
Für das Bilden von Summen haben DataFrames eine sum()-Funktion:

Code: Alles auswählen

import pandas as pd
teile = {"L": [4, 5, 1, 8, 10, 2, 4], "isoliert": [True, True, False, False, True, True, False]}
df = pd.DataFrame(teile)
print(df)
summe_isoliert = df.loc[df['isoliert'], 'L'].sum()
print(summe_isoliert)
summe_unisoliert = df.loc[~df['isoliert'], 'L'].sum()
print(summe_unisoliert)
Edit: Ich habe übersehen, dass es um NaN-Werte geht. Da kannst du ja den von dir schon verwendeten Filter anwenden, statt wie ich hier nur nach True/False zu schauen.

Code: Alles auswählen

df.loc[~df["isoliert"].isna(), "L"].sum()
Antworten