Seite 1 von 1

Panda ist Zeile NaN oder Nummer

Verfasst: Samstag 9. Mai 2020, 15:43
von ftiago
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

Re: Panda ist Zeile NaN oder Nummer

Verfasst: Samstag 9. Mai 2020, 17:24
von ftiago
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)

Re: Panda ist Zeile NaN oder Nummer

Verfasst: Sonntag 10. Mai 2020, 16:32
von ftiago
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

Re: Panda ist Zeile NaN oder Nummer

Verfasst: Sonntag 10. Mai 2020, 17:54
von einfachTobi
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()