2013-02-06 14 views
5

Ho un DataFrame che mi piacerebbe utilizzare il metodo 'str.contrains()'. Credevo di aver trovato il modo di farlo quando ho letto pandas + dataframe - select by partial string. Tuttavia, continuo a ricevere un errore di valore.Errore di valore durante la divisione in panda

mio dataframe è la seguente:

ID,ENROLLMENT_DATE,TRAINER_MANAGING,TRAINER_OPERATOR,FIRST_VISIT_DATE 
1536D,12-Feb-12,"06DA1B3-Lebanon NH",,15-Feb-12 
F15D,18-May-12,"06405B2-Lebanon NH",,25-Jul-12 
8096,8-Aug-12,"0643D38-Hanover NH","0643D38-Hanover NH",25-Jun-12 
A036,1-Apr-12,"06CB8CF-Hanover NH","06CB8CF-Hanover NH",9-Aug-12 
8944,19-Feb-12,"06D26AD-Hanover NH",,4-Feb-12 
1004E,8-Jun-12,"06388B2-Lebanon NH",,24-Dec-11 
11795,3-Jul-12,"0649597-White River VT","0649597-White River VT",30-Mar-12 
30D7,11-Nov-12,"06D95A3-Hanover NH","06D95A3-Hanover NH",30-Nov-11 
3AE2,21-Feb-12,"06405B2-Lebanon NH",,26-Oct-12 
B0FE,17-Feb-12,"06D1B9D-Hartland VT",,16-Feb-12 
127A1,11-Dec-11,"064456E-Hanover NH","064456E-Hanover NH",11-Nov-12 
161FF,20-Feb-12,"0643D38-Hanover NH","0643D38-Hanover NH",3-Jul-12 
A036,30-Nov-11,"063B208-Randolph VT","063B208-Randolph VT", 
475B,25-Sep-12,"06D26AD-Hanover NH",,5-Nov-12 
151A3,7-Mar-12,"06388B2-Lebanon NH",,16-Nov-12 
CA62,3-Jan-12,,, 
D31B,18-Dec-11,"06405B2-Lebanon NH",,9-Jan-12 
20F5,8-Jul-12,"0669C50-Randolph VT",,3-Feb-12 
8096,19-Dec-11,"0649597-White River VT","0649597-White River VT",9-Apr-12 
14E48,1-Aug-12,"06D3206-Hanover NH",, 
177F8,20-Aug-12,"063B208-Randolph VT","063B208-Randolph VT",5-May-12 
553E,11-Oct-12,"06D95A3-Hanover NH","06D95A3-Hanover NH",8-Mar-12 
12D5F,18-Jul-12,"0649597-White River VT","0649597-White River VT",2-Nov-12 
C6DC,13-Apr-12,"06388B2-Lebanon NH",, 
11795,27-Feb-12,"0643D38-Hanover NH","0643D38-Hanover NH",19-Jun-12 
17B43,11-Aug-12,,,22-Oct-12 
A036,11-Aug-12,"06D3206-Hanover NH",,19-Jun-12 

Poi ho eseguire il codice seguente:

test = pandas.read_csv('testcsv.csv') 
test[test.TRAINER_MANAGING.str.contains('Han', na=False)] 

ed ottengo il seguente errore:

--------------------------------------------------------------------------- 
ValueError        Traceback (most recent call last) 
<ipython-input-54-e0c4624c9346> in <module>() 
----> 1 test[test.TRAINER_MANAGING.str.contains('Han', na=False)] 

.virtualenvs/ipython/lib/python2.7/site-packages/pandas/core/frame.pyc in __getitem__(self, key) 
    1958 
    1959    # also raises Exception if object array with NA values 
-> 1960    if com._is_bool_indexer(key): 
    1961     key = np.asarray(key, dtype=bool) 
    1962    return self._getitem_array(key) 

.virtualenvs/ipython/lib/python2.7/site-packages/pandas/core/common.pyc in _is_bool_indexer(key) 
    685   if not lib.is_bool_array(key): 
    686    if isnull(key).any(): 
--> 687     raise ValueError('cannot index with vector containing ' 
    688         'NA/NaN values') 
    689    return False 

ValueError: cannot index with vector containing NA/NaN values 

Mi sento come se fossi manca qualcosa di semplice Qualsiasi aiuto sarebbe apprezzato.

+2

aggiunto come [problema su github] (https://github.com/pydata/pandas/issues/2806). –

risposta

15

La ricerca di stringhe restituisce ancora valori nan mentre l'operazione di slicing funziona solo con i booleani. Sembra che "na = False" non funzioni (in questo caso?), Posso replicarlo sulla mia macchina con l'ultima versione (rilasciata) di Pandas.

È possibile risolvere mediante l'applicazione prima la funzione .fillna() per i risultati come:

test[test.TRAINER_MANAGING.str.contains('Han').fillna(False)] 

che restituisce:

 ID ENROLLMENT_DATE TRAINER_MANAGING TRAINER_OPERATOR FIRST_VISIT_DATE 
2 8096  8-Aug-12 0643D38-Hanover NH 0643D38-Hanover NH  25-Jun-12 
3 A036  1-Apr-12 06CB8CF-Hanover NH 06CB8CF-Hanover NH   9-Aug-12 
4 8944  19-Feb-12 06D26AD-Hanover NH     NaN   4-Feb-12 
7 30D7  11-Nov-12 06D95A3-Hanover NH 06D95A3-Hanover NH  30-Nov-11 
10 127A1  11-Dec-11 064456E-Hanover NH 064456E-Hanover NH  11-Nov-12 
11 161FF  20-Feb-12 0643D38-Hanover NH 0643D38-Hanover NH   3-Jul-12 
13 475B  25-Sep-12 06D26AD-Hanover NH     NaN   5-Nov-12 
19 14E48  1-Aug-12 06D3206-Hanover NH     NaN    NaN 
21 553E  11-Oct-12 06D95A3-Hanover NH 06D95A3-Hanover NH   8-Mar-12 
24 11795  27-Feb-12 0643D38-Hanover NH 0643D38-Hanover NH  19-Jun-12 
26 A036  11-Aug-12 06D3206-Hanover NH     NaN  19-Jun-12 

non ho mai usato la funzione str.contains prima in modo Non sono sicuro che non funzioni correttamente. Dovremmo aprire un problema su github se dovrebbe funzionare come nel tuo esempio.

+0

Grazie per l'aiuto. Potrei postare su GitHub, ma sono una novità assoluta quando si parla di panda, quindi ho pensato di provare la mia domanda qui prima di mettermi in imbarazzo. Se pensi che valga la pena, pubblicherò anche lì. – BigHandsome

+1

@BigHandsome Penso anche che i documenti suggeriscano che 'na' dovrebbe essere un valore di riempimento (anche se stranamente formulato) –

+0

@AndyHayden Dopo aver riletto il doc dell'API [1] e questo ticket [2] penso che il mio codice dovrebbe funzionare. Ma sono abbastanza nuovo a tutto questo, quindi mi dilungherò a voi ragazzi se dovrei presentare un biglietto. [1]: http: //pandas.pydata.org/pandas-docs/stable/basics.html? Highlight = startswith # vectorized-string-methods [2]: https: //github.com/pydata/ pandas/issues/1689 – BigHandsome

Problemi correlati