Python - funkce vrací NaNy pro druhý a další řádky z dataframu

Karmelos

  • *****
  • 1 042
    • Zobrazit profil
    • E-mail
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?

Kód: [Vybrat]
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:
Kód: [Vybrat]
...
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]
Gréta je nejlepší.


robac

  • ***
  • 203
    • Zobrazit profil
    • E-mail
Re:Python - funkce vrací NaNy pro druhý a další řádky z dataframu
« Odpověď #1 kdy: 31. 03. 2021, 14:13:03 »
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:
Kód: [Vybrat]
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:
Kód: [Vybrat]
a = b



Karmelos

  • *****
  • 1 042
    • Zobrazit profil
    • E-mail
Re:Python - funkce vrací NaNy pro druhý a další řádky z dataframu
« Odpověď #2 kdy: 31. 03. 2021, 15:53:19 »
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é".

Kód: [Vybrat]
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. 

Kód: [Vybrat]
Name = a.name
b = b.rename(Name)

Takže to takto použiju, ale vůbec netuším proč tomu tak je.

Vzorove csv:
Kód: [Vybrat]
"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
Gréta je nejlepší.