Closed kbevers closed 3 years ago
@busstoptaktik ved du noget mere om den her problemstilling end jeg gør?
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!
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)
)
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
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 :-)
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 :-)
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.
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:
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:
Umiddelbart ser det ud til at problemet kan løses ved at kalde
dropna()
på dataframen når den skabes medfire.niv.find_faneblad()
. Ideelt set skulle det virke meddropna(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.