2016-03-12 12 views
6

Sto provando a verificare se un determinato valore è contenuto in una colonna python. Sto usando df.date.isin(['07311954']), che non dubito di essere un buon strumento. Il problema è che ho più di 350K righe e l'output non mostrerà tutti gli in modo da poter vedere se il valore è effettivamente contenuto. In parole povere, voglio solo sapere (S/N) se un valore specifico è contenuto o meno in una colonna. Il mio codice segue:Verificare se un determinato valore è contenuto in una colonna dataframe nei panda

import numpy as np 
import pandas as pd 
import glob 


df = (pd.read_csv('/home/jayaramdas/anaconda3/Thesis/FEC_data/itpas2_data/itpas214.txt',\ 
    sep='|', header=None, low_memory=False, names=['1', '2', '3', '4', '5', '6', '7', \ 
    '8', '9', '10', '11', '12', '13', 'date', '15', '16', '17', '18', '19', '20', \ 
    '21', '22'])) 

df.date.isin(['07311954']) 

risposta

6

Penso che è necessario str.contains, se avete bisogno di righe in cui i valori della colonna date contiene la stringa 07311954:

print df[df['date'].astype(str).str.contains('07311954')] 

O se type di date colonna è string:

print df[df['date'].str.contains('07311954')] 

Se si desidera controllare le ultime 4 cifre per string1954 nella colonna date:

print df[df['date'].astype(str).str[-4:].str.contains('1954')] 

Esempio:

print df['date'] 
0 8152007 
1 9262007 
2 7311954 
3 2252011 
4 2012011 
5 2012011 
6 2222011 
7 2282011 
Name: date, dtype: int64 

print df['date'].astype(str).str[-4:].str.contains('1954') 
0 False 
1 False 
2  True 
3 False 
4 False 
5 False 
6 False 
7 False 
Name: date, dtype: bool 

print df[df['date'].astype(str).str[-4:].str.contains('1954')] 
    cmte_id trans_typ entity_typ state employer occupation  date \ 
2 C00119040  24K  CCM MD  NaN   NaN 7311954 

    amount  fec_id cand_id 
2 1000 C00140715 H2MD05155 
+0

Penso che tu abbia eseguito il codice suggerito e ottengo ancora un elenco molto lungo e incompleto. –

+0

Ho appena eseguito, stavo avendo alcuni errori di sintassi in precedenza così fermato per una pausa. Quando eseguo il codice sopra, indica la data del 1954; ma quando eseguo il codice sullo stesso set di dati dopo averlo implementato (http: // stackoverflow.it/questions/35939558/using-timegrouper-1m-to-group-and-sum-by-columns-is-messing-up-my-date-index-p/35957110 # 35957110) restituisce 'Empty DataFrame Colonne: [cmte_id, trans_typ, entity_typ, state, date, amount, fec_id, cand_id] Index: [] ' –

+0

Jezrael, ho intenzione di esaminare nuovamente i file di dati e vedere quanti file hanno il mercato delle colonne di date con un data che è "fuori dall'intervallo". In teoria, tutte le mie date dovrebbero essere tra il 2007 e il 2014. C'è un modo per usare il codice che hai postato sopra ma stampare tutti i valori con le ultime 4 cifre tra il 2007 e il 2014? Vorrei anche cancellare tutte le righe che si verificano in quanto tali, ma prima ho bisogno di localizzarle in modo da poter informare l'origine dei dati dell'errore nei dati. Se puoi aiutarmi, sarebbe fantastico! –

12

È possibile utilizzare any:

print any(df.column == 07311954) 
True  #true if it contains the number, false otherwise 

Se invece volete vedere quante volte '07311954' si verifica in un colonna che è possibile utilizzare:

df.column[df.column == 07311954].count() 
+0

Grazie; che funzioni! –

10

Si può semplicemente utilizzare questo:

'07311954' in df.date.values che restituisce True o False


Ecco l'ulteriore spiegazione:

In panda, utilizzando in controllo direttamente con dataframe e Serie (per esempio val in df o val in series) verificherà se lo val è contenuto nell'indice .

MA puoi ancora utilizzare il controllo in per i loro valori (invece di Indice)! Basta usare val in df.col_name.values o val in series.values. In questo modo, stai effettivamente verificando lo val con un array Numpy.

E .isin(vals) è il contrario, controlla se i valori del dataframe/Serie sono in il vals. Qui vals deve essere impostato o elenco come. Quindi questo non è il modo naturale di andare per la domanda.