2017-01-18 4 views
1

Ich habe ein DataFrame (ziemlich groß, schwer & c zu reproduzieren), für die ich dieses Verhalten beobachten:Pandas "fillna" ignoriert die "Inplace = True" Stichwort

>>> df.info(verbose=True,memory_usage=True,null_counts=True) 
<class 'pandas.core.frame.DataFrame'> 
Int64Index: 49841 entries, 0 to 49878 
Data columns (total 70 columns): 
... 
channel        25101 non-null object 
... 
dtypes: bool(10), datetime64[ns](6), float64(2), int64(32), object(20) 
memory usage: 23.7+ MB 
>>> df.channel.fillna("Unknown",inplace=True) 
>>> df.info(verbose=True,memory_usage=True,null_counts=True) 
<class 'pandas.core.frame.DataFrame'> 
Int64Index: 49841 entries, 0 to 49878 
Data columns (total 70 columns): 
... 
channel        25101 non-null object 
... 
dtypes: bool(10), datetime64[ns](6), float64(2), int64(32), object(20) 
memory usage: 23.7+ MB 

IOW, es scheint, dass df.channel.fillna("Unknown",inplace=True) hat keine Wirkung.

Wie kann das sein? Ist das ein Fehler? Was mache ich falsch ?!

PS. Zusammenfassung aus den Kommentaren:

  • df.is_copy ist None
  • df._is_view ist False
  • channel ist eine Spalte, kein Attribut, weil es von info
+0

was bedeutet 'df [! Df.channel = df.channel.fillna ('Unbekannte')]' kehrt? – Boud

+1

Ich vermute, es ersetzt nichts, da der Inplace-Code, den Sie schreiben, funktionieren soll, wenn Sie nicht bereits eine Ansicht – Boud

+1

"inplace: boolean, default Falsch Wenn True, füllen Sie Stelle. Hinweis: Dies wird alle anderen Ansichten ändern auf diesem Objekt (z. B. eine Kopie ohne Kopie für eine Spalte in einem DataFrame). ". Wäre das der Kern des Problems? –

Antwort

1

Vom documentation aufgeführt wird:

Sie können Attributzugriff verwenden, um ein vorhandenes Element einer Serie oder Spalte eines DataFrame zu ändern, aber seien Sie vorsichtig; Wenn Sie versuchen, das Attribut Zugriff verwenden, um eine neue Spalte zu erstellen, schlägt es im Hintergrund fehl und erstellt ein neues Attribut statt einer neuen Spalte.

Wir vermuten, dass Sie df.channel zuerst zugewiesen, dann df['channel'] und das schafft das unerwartete Verhalten.

+0

wenn 'channel' ein Attribut wäre, wäre es nicht von 'df.info' als Spalte aufgelistet worden. – sds

+0

Ich sage, Sie haben beide – Boud

+0

Okay, wie überprüfe ich, ob Sie Recht haben? – sds

1

Der Grund stellte sich heraus, die folgende sqlalchemy Abfrage sein:

select * 
from table1 
join table2 
on table1.id = table2.id 

Das resultierende DF hat zwei Spalten erfolgt id und insgesamt Verwüstung genannt.

Lösung:

select * 
from table1 
join (select id as id2, ... from table2) t2 
on table1.id = t2.id2 
Verwandte Themen