2016-05-11 14 views
2

Ich benutze Pandas 0.18. Ich habe einen Datenrahmen von CSV unter Verwendung pd.read_csv() geladen, und es sieht so aus, als ob die leeren Zellen in CSV als NaN im Datenrahmen geladen wurden.Wie nach NaN in String-Spalte in Pandas filtern?

Jetzt möchte ich die Anzahl der Zeilen mit einem leeren Wert in einer bestimmten Spalte finden, aber ich habe Probleme.

Das ist mein Datenrahmen:

 ods   id provider 
0 A86016  NaN  emis 
1 L81042  463061  NaN 
2 C84013  NaN  tpp 
3 G82228  462941  emis 
4 C81083  NaN  tpp 

Dies ist, was ich von einem df.describe() erhalten:

  ods   id provider 
count  9897  7186  9022 
unique 8066  192  4 
top  N83028  463090  emis 
freq   7  169  4860 

ich alle Zeilen erhalten möchten, wo provider im CSV leer war. Dies ist, was ich versucht habe:

>>> print len(df[df.provider == 'NaN']) 
0 
>>> print len(df[df.provider == np.nan]) 
0 

ich sehen kann, dass es dort einige NaN Werte sind (zum Beispiel Zeile 1), so was gibt?

Warum konvertiert Pandas auch leere Werte in String-Spalten wie provider zu NaN - wäre es nicht sinnvoller, sie in eine leere Zeichenfolge zu konvertieren?

Antwort

3

Verwenden isnull zum Vergleichen NaN:

df = pd.DataFrame({'ods': {0: 'A86016', 1: 'L81042', 2: 'C84013', 3: 'G82228', 4: 'C81083'}, 
        'id': {0: np.nan, 1: 463061.0, 2: np.nan, 3: 462941.0, 4: np.nan}, 
        'provider': {0: 'emis', 1: np.nan, 2: 'tpp', 3: 'emis', 4: 'tpp'}}) 

print df 
     id  ods provider 
0  NaN A86016  emis 
1 463061.0 L81042  NaN 
2  NaN C84013  tpp 
3 462941.0 G82228  emis 
4  NaN C81083  tpp 

print (df[df.provider.isnull()]) 

     ods  id provider 
1 L81042 463061.0  NaN 

print len(df[df.provider.isnull()]) 
1 

Wenn Sie konvertieren müssen NaN zu `` verwenden fillna:

df.provider.fillna('', inplace=True) 
print df 
     id  ods provider 
0  NaN A86016  emis 
1 463061.0 L81042   
2  NaN C84013  tpp 
3 462941.0 G82228  emis 
4  NaN C81083  tpp 

Docs:

Warnung

Man muss darauf achten, dass in Python (und numpy) die Nanos nicht gleich vergleichen, aber keine tun. Beachten Sie, dass Pandas/numpy die Tatsache np.nan! = Np.nan verwendet und None wie np.nan behandelt.

In [11]: None == None 
Out[11]: True 

In [12]: np.nan == np.nan 
Out[12]: False 

So im Vergleich zu oben, ein Skalar Gleichheitsvergleich im Vergleich zu einem None/np.nan bietet keine nützlichen Informationen.

In [13]: df2['one'] == np.nan 
Out[13]: 
a False 
b False 
c False 
d False 
e False 
f False 
g False 
h False 
Name: one, dtype: bool 

Aber wenn nan ist string:

df = pd.DataFrame({'ods': {0: 'A86016', 1: 'L81042', 2: 'C84013', 3: 'G82228', 4: 'C81083'}, 
        'id': {0: np.nan, 1: 463061.0, 2: np.nan, 3: 462941.0, 4: np.nan}, 
        'provider': {0: 'emis', 1: 'nan', 2: 'tpp', 3: 'emis', 4: 'tpp'}}) 

print df 
     ods  id provider 
0 A86016  NaN  emis 
1 L81042 463061.0  nan 
2 C84013  NaN  tpp 
3 G82228 462941.0  emis 
4 C81083  NaN  tpp 


print (df[df.provider == 'nan']) 
     ods  id provider 
1 L81042 463061.0  nan 

wissen Sie, warum Pandas Importe leere Strings als NaN eher als leere Strings?

Siehe docs (fett von mir):

na_values: str, Liste artige oder dict, default Keine

Zusätzliche Strings als NA erkennen/NaN. Wenn dict bestanden wird, spezifische NA-Werte pro Spalte. Standardmäßig werden die folgenden Werte als NaN interpretiert: '-1. # IND', '1. # QNAN', '1. # IND', '-1. # QNAN', '# N/AN/A', ' # N/A ',' N/A ',' NA ',' #NA ',' NULL ',' NaN ',' -NaN ',' Nan ',' -nan ', ' '.

+0

Dank! Nur noch eine Frage, weißt du, warum Pandas leere Strings als 'NaN' importieren anstatt leere Strings? – Richard

1

Sie können zunächst die Werte na speichern und löschen Sie dann den Rest:

without_na = df['provider'].dropna() 
df[~df.index.isin(without_na.index)]