2017-02-16 21 views
1

mit Pandas 0.18.1, realisierte ich ein anderes Verhalten beim Filtern einer Spalte, deren dtypecategory ist. Hier ist ein minimales Beispiel.Pandas: Kategorie dtype und Filter

import pandas as pd 
import numpy as np 

l = np.random.randint(1, 4, 50) 
df = pd.DataFrame(dict(c_type=l, i_type=l)) 
df['c_type'] = df.c_type.astype('category') 

df.info() 

<class 'pandas.core.frame.DataFrame'> 
RangeIndex: 50 entries, 0 to 49 
Data columns (total 2 columns): 
c_type 50 non-null category 
i_type 50 non-null int64 
dtypes: category(1), int64(1) 
memory usage: 554.0 bytes 

eine der Wert der Spalten Typ Integer Ausfiltern führt zu

df[df.i_type.isin([1, 2])].i_type.value_counts() 

2 20 
1 17 
Name: i_type, dtype: int64 

aber die gleiche Filterung auf der Säule Kategorietyp hält den Wert als Eintrag gefiltert

df[df.c_type.isin([1, 2])].c_type.value_counts() 

2 20 
1 17 
3  0 
Name: c_type, dtype: int64 

Obwohl der Filter funktioniert, scheint mir das Verhalten ungewöhnlich. Der Filter könnte zum Beispiel verwendet werden, um zukünftige Spalten von einer pivot_table Funktion auszuschließen, die einen zusätzlichen Filter erfordert, wenn category behandelt wird.

Ist es ein erwartetes Verhalten?

Antwort

1

Es ist die erwartete Verhalten, wenn Check categorical docs:

Series Methoden wie Series.value_counts() alle Kategorien verwenden, auch wenn einige der Kategorien in den Daten nicht vorhanden sind:

In [100]: s = pd.Series(pd.Categorical(["a","b","c","c"], categories=["c","a","b","d"])) 

In [101]: s.value_counts() 
Out[101]: 
c 2 
b 1 
a 1 
d 0 
dtype: int64 

Also, wenn Filter durch 5 (Wert ist nicht in Gegenwart) erhalten 0 für jede Kategorie:

print (df[df.c_type.isin([5])].c_type.value_counts()) 
3 0 
2 0 
1 0 
Name: c_type, dtype: int64 
+0

Ich sehe. Danke, dass Sie diesen Punkt hervorgehoben haben. –

Verwandte Themen