SDFIdk / FIRE

🔥 FIRE - FIkspunktREgister
https://sdfidk.github.io/FIRE/
MIT License
4 stars 8 forks source link

fire niv: Tomme Excel rækker indlæses i dataframes #381

Closed kbevers closed 3 years ago

kbevers commented 3 years ago

Eksempel i denne fil: 2021_KDI_VLTJ.xlsx. Fanebladet "Nyetablerede punkter". Der er kun udfyldt en enkelt række men alligevel tror Pandas at der er 5 alt i alt. De sidste fire indlæses som variationer af NaN:

0  Agger Færgeleje         nan  56.702  8.245     2021-04-12  b004276  Aggervej 35.\nBetonbygning, besøgscenter.\nPun...       Bolt               15.0  nan
1              nan         nan     NaN    NaN            NaT      nan                                                nan        nan                NaN  nan
2              nan         nan     NaN    NaN            NaT      nan                                                nan        nan                NaN  nan
3              nan         nan     NaN    NaN            NaT      nan                                                nan        nan                NaN  nan
4              nan         nan     NaN    NaN            NaT      nan                                                nan        nan                NaN  nan

Situationen opstår formentligt hvis man kommer til at udfylde en celle i fx række 5 og så sletter den igen. Pt. kan problemet løses af brugeren ved at slette de rækker der skaber problemet. Det gøres sådan her:

excel

Umiddelbart ser det ud til at problemet kan løses ved at kalde dropna() på dataframen når den skabes med fire.niv.find_faneblad(). Ideelt set skulle det virke med dropna(how="all"), der kun fjerne rækken hvis alle værdier i den er N/A, men det ser ikke ud til at virke. Sikkert fordi der er tre forskellige varianter af NaN i spil i dette eksempel. dropna() uden parametre fjerner rækker når der findes et enkelt NaN i rækken. Det ser ud til at virke i dette eksempel men virker risikabelt at benytte i en generel løsning.

kbevers commented 3 years ago

@busstoptaktik ved du noget mere om den her problemstilling end jeg gør?

busstoptaktik commented 3 years ago

Er det virkelig Vemb-Lemvig-Thyborøn Jernbane vi har at gøre med her, eller findes der en anden baggrund for forkortelsen VLTJ?

@busstoptaktik ved du noget mere om den her problemstilling end jeg gør?

Jeg ved næppe mere om den, men jeg synes jeg har kæmpet med den slags på mange slagmarker efterhånden. Der er en god grund til at relationelle databaser bruger mange kræfter (og en ekstra byte pr. felt) på at understøtte NULL, og det ville da være rart hvis Pandas gjorde det samme!

I dette tilfælde er det nok sundest at fjerne alle rækker der ikke har søjlen "Hvem" sat - men nogen generel løsning er det jo ikke ligefrem. Det er bare træls!

kbevers commented 3 years ago

Er det virkelig Vemb-Lemvig-Thyborøn Jernbane vi har at gøre med her, eller findes der en anden baggrund for forkortelsen VLTJ?

Yes, så du kan godt sætte den med Tørfisk på og begynde at banke i gulvet!

Det er bare træls!

Yes. En potentiel mere fornuftig løsning er nedenstående, hvor dropna() kaldes før pandas ved hvilke typer der bør findes i de enkelte celler. Jeg har ikke prøvet det af endnu, men det kan være det fungerer bedre.

        return (
            pd.read_excel(
                f"{projektnavn}.xlsx",
                sheet_name=faneblad,
                usecols=anvendte(arkdef),
            )
            .dropna(how="all")
            .astype(arkdef)
        )
busstoptaktik commented 3 years ago

Det ser ud til at how="all" er essentiel: Der kan forekomme rækker med NaN i søjler til højre for sidste anvendte søjle (muligvis hvis man har haft cursoren inde i et felt, eller bare samme situation som i den oprindelige årsagsformodning: skriv-og-slet), og i den situation slettes samtlige rækker. Med how="all" og dropna() før astype() ser det ud til at virke, både for ilæg_nye_punkter og ilæg_revision

busstoptaktik commented 3 years ago

Yes, så du kan godt sætte den med Tørfisk på og begynde at banke i gulvet!

Hm - jeg kendte ikke "den med Tørfisk", men jeg kan se på antallet af Googlehits at "den være en hit", fra dengang jeg var 21, havde mere hår, mindre spæk og lige havde mødt min livsledsagerske...

Men jeg er deltidsjernbanenørd, så forkortelser der ender på "J" fanger mig (HHGJ er en anden sikker vinder). Og så har jeg tilbragt to sommerferier i Lemvig, som sgu er en dejlig by :-)

kbevers commented 3 years ago

Med how="all" og dropna() før astype() ser det ud til at virke, både for ilæg_nye_punkter og ilæg_revision

Glimrende! Så lad os da prøve det af i den virkelige verden.

Hm - jeg kendte ikke "den med Tørfisk", men jeg kan se på antallet af Googlehits at "den være en hit", fra dengang jeg var 21, havde mere hår, mindre spæk og lige havde mødt min livsledsagerske...

Intet halbal uden VLTJ og Tørfisk. Remixet fra omkring år 2000 pustede ekstra liv i den til stor fornøjelse for en generation mere :-)

busstoptaktik commented 3 years ago

Glimrende! Så lad os da prøve det af i den virkelige verden.

Jæb. Den suppleres lige med en .replace("nan", "") for kompletheds skyld. Commit på vej.