Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: Karmelos 31. 03. 2021, 12:56:32
-
Ahoj, peru se s takovou blbostí. Jako vstup do funkce používám řádek z csv souboru nacpaný přez dataframe do panda Serie (zkoušel jsem i dataframe).
Potíž je v tom, že funkce vrací validní výstup pouze pro první řádek.
Pokud do ní pošlu druhý řádek tak vrací NaNy.
Problém ve funkci asi nemám, pokud totiž modifikuju ten první řádek hodnotama ze druhého, funkce opět vrátí validní výstup.
Poradil by někdo kde dělám chybu prosím?
Cidata = pd.read_csv("DATA_input.csv")
#Cidata je dataframe
Cidata.columns =['A','B','C','D','E','F']
Cidata.A = Cidata.A * 60
#Tohle mozna pusobi problem, ale sloupec A vypada korektne
a = Cidata.loc[0]
# a je ta Serie z prvniho radku
mojefce(a)
#Tohle se korektne vypocitalo
b = Cidata.loc[1]
# b je taky Serie ale ze druheho radku
mojefce(b)
#Tohle se bohuzel vypocitalo nekorektne
#Tady prepisuju hodnoty v a
a.A = b.A
#Tady to prepsani A vyhazuje nejaky divny warning, proc?
a.B = b.B
a.C = b.C
a.D = b.D
mojefce(a)
#Tohle se vypocitalo korektne
Vystup:
...
a = CMP_idata.loc[0]
mojefce(a)
Out[323]:
A B C ... X Y Z
0 1800.0 41.512937 33.311368 ... 65.514578 621536.067673 152.312866
[1 rows x 29 columns]
b = CMP_idata.loc[1]
mojefce(b)
Out[325]:
A B C D E ... V W X Y Z
1 3000.0 41.276885 31.400089 101.539766 0.0 ... NaN NaN NaN NaN NaN
[1 rows x 29 columns]
a.A = b.A
C:\Users\XXX\AppData\Roaming\Python\Python37\site-packages\pandas\core\generic.py:5489: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
self[name] = value
a.B = b.B
a.C = b.C
a.D = b.D
mojefce(a)
Out[330]:
A B C ... X Y Z
0 3000.0 41.276885 31.400089 ... 121.663161 633544.033014 164.771876
[1 rows x 29 columns]
-
Chtěl jsem tomu věnovat chvíli času, ale...
- je takový problém vložit sem ten kód celý?
- je problém sem hodit vzorový CSV?
- zkoušel jste debugging?
- když Vám to hodí warning i s odkazem na dokumentaci, tak se obtěžujete si to přečíst nebo ne?
- co jsou sloupce resp. hodnoty X, Y, Z? Ty se vytváří ve funkci mojefce? Protože dle přiloženého kódu nejdou z CSV....
Vzhledem k nedostatku informací a tomu, že uvedený kus kódu víceméně dělá to, co od něj asi očekáváte, si tipuji, že problém je právě v té funkci mojefce...
Uvědomujete si, že zde:
a.A = b.A
#Tady to prepsani A vyhazuje nejaky divny warning, proc?
a.B = b.B
a.C = b.C
a.D = b.D
nepřepisujete všechny sloupce v a?
Co se stane, když to přepíšete na:
a = b
-
Zdravím, díky za snahu, asi jsem to nějak vyřešil, ale stejně odpovím, třeba se to někomu hodí.
..
..
Odkaz na dokumentaci jsem přečetl, ale netuším co s tím - Mělo by být snad jedno jestli odkazuju nebo kopíruju. Hodnoty toho dataframe potažmo te series používám jen jako vstupy.
To hraní si s přepisováním je jen pro demonstraci, že to bere jen první řádek. Relevantní jsou v tuto chvíli pouze první 4 hodnoty, pátý a šestý sloupec je momentálně nepoužívaný.
Těch 20 něco sloupců jsou vypočtené hodnoty pro další zpracování.
Pokud udělám a = b dostanu na výstupu zase NaNy.
Jediný rozdíl mezi a a b vidím v tom, že u a je Name: 0 a u b je Name: 1 jinak mi příjdou "stejné".
print(b)
A 3000.000000
B 41.276885
C 31.400089
D 101.539766
E 0.000000
F 0.000000
Name: 1, dtype: float64
print(a)
A 3000.000000
B 41.276885
C 31.400089
D 101.539766
E 0.000000
F 0.000000
Name: 0, dtype: float64
A teď jsem přišel na to, že pokud změním Name u b na 0, výstup mojí funkce vypadá v pořádku.
Name = a.name
b = b.rename(Name)
Takže to takto použiju, ale vůbec netuším proč tomu tak je.
Vzorove csv:"HH","PP","PT","PG","PA","TA"
30,41.512936596218,33.3113681868743,93.2975194660734,0,0
50,41.2768854282536,31.4000889877642,101.539766407119,0,0
30,41.512936596218,33.3113681868743,93.2975194660734,0,0
70,36.9049333333333,30.0625888888889,103.410355555556,0,0