2016-07-04 21 views
2

Ich habe die meisten SettingWithCopy Warnungen mit .loc[: (foo, bar)] Konstruktion vermieden.Unerwarteter SettingWithCopyWarning

Aber ich weiß nicht, wie man richtig einen Fall konstruieren:

for sec in security_list: 
    stochs.loc[:, (sec,'entry_signal')][stochs[sec, 'raw_signal'].shift(1) == stochs[sec, 'raw_signal']] = 0 

Was ich bin versucht: in dem stochs Datenrahmen, um eine neue Spalte hinzufügen, entry_signal. entry_signal ist 1, 0 oder -1. Es ist 0, wenn die raw_signal unverändert von der vorherigen raw_signal ist, ansonsten ist es der Wert raw_signal (1 oder -1).

Ich denke, Pandas mag nicht das zweite Indexierungsfragment, [stochs[sec, 'raw_signal'].shift(1) == stochs[sec, 'raw_signal']], weil das eine Kopie hervorbringt.

Kann jemand empfehlen, diese Anweisung richtig zu schreiben?

Dank

+1

Versuch 'stochs.loc setzen sollte [ stochs [sec, 'raw_signal']. shift (1) == stochs [sek, 'raw_signal'], (sec, 'entry_signal')] = 0' – EdChum

+0

@EdChum Ja, das hat funktioniert. Wusste nicht, dass eine solche Indizierung funktionieren würde. Vielen Dank. – user3556757

Antwort

2

Wechseln zu:

stochs.loc[stochs[sec, 'raw_signal'].shift(1) == stochs[sec, 'raw_signal'], (sec,'entry_signal')] = 0 

was Sie chained indexing genannt haben als Sie doppelt Subskribierung waren, so dass Sie die Bedingung innerhalb der Klammern zu loc

+0

Ja, ich denke, die 'stochs [sec, 'raw_signal']. Shift (1) == stochs [sec, 'raw_signal']' gibt eine Liste von Zeilenindizes zurück, die ich an den ersten Parameter '.loc []' übergebe . – user3556757