Python Coding SettingWithCopyWarning

Pagina: 1
Acties:

Onderwerpen

Vraag


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hoi,

De onderstaande code gebruik ik in Spyder (Python), waarmee ik data importeer mbv pandaas. Het rekent precies uit wat ik wil echter krijg ik de volgende foutmelding:
"SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame"

df2.insert(2,'A',"")
for j in range(len(df2)-1):
if df2.G[j] < df2.G[j+1]:
df2.A[j] = 0
else:
df2.A[j] = 1

Ik wil een nieuwe kolom 'A' maken waarin een 0 wordt weergegeven als de waarde in kolom G rij j kleiner is dan de waarde in kolom G rij j+1....

Hopelijk kan iemand mij helpen om deze foutmelding te omzeilen....

gr Maarten

Alle reacties


Acties:
  • 0 Henk 'm!

  • Barreljan
  • Registratie: December 2001
  • Laatst online: 10-09 10:42

Barreljan

...Zoom-Zoom...

Wellicht je code in codetags zetten? Dit leest niet lekker...
En voor men een slot werpt; wat heb je zelf al gedaan? Dat haal ik er niet uit. Het is geen kant en klare oplossingen fabriek hier ;) Zie ook de Quickstart

Foutmelding in Google of een andere zoekmachine gegooid? Mijn eerste hit:
How to deal with SettingWithCopyWarning in Pandas?

[ Voor 9% gewijzigd door Barreljan op 15-07-2019 16:32 ]

Time Attacker met de Mazda 323F 2.5 V6 J-spec | PV output


Acties:
  • +1 Henk 'm!

  • Morrar
  • Registratie: Juni 2002
  • Laatst online: 08:54
Een for loop is niet echt een nette oplossing hiervoor... Een gevectoriseerde oplossing is veel sneller. In feite moet je dan twee dingen doen:

1. Maak een kolom ("G_shift") die kolom "G" met 1 rij verschuift (zie shift functie)
2. Vergelijk per rij kolom "G" en "G_shift" en ken de uitkomst toe aan kolom "A" (zie apply functie)

De "SettingWithCopyWarning" krijg je als je een waarde toekent aan een selectie uit een dataframe; dat is meestal geen goed idee. Je kunt dit meestal omzeilen door .loc of .assign() te gebruiken.


Zeer simpel voorbeeldje:
Python:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# Voorbeeld data
sample = pd.DataFrame({
    "G": [1, 4, 3, 2, 6]
})

# In twee regels (past data frame aan)
sample["G_shift"] = df["G"].shift(-1)
sample["A"] = sample.apply(lambda row: int(row["G"] < row["G_shift"]), axis=1)

# One-liner (past originele data frame niet aan)
sample_shift = (
    sample
    .assign(G_shift=lambda df: df["G"].shift(-1))
    .assign(A=lambda df: df.apply(lambda row: int(row["G"] < row["G_shift"]), axis=1))
)

# Let op: de waarde voor G_shift ontbreekt voor laatste rij!

[ Voor 52% gewijzigd door Morrar op 17-07-2019 20:25 ]