2015-09-10 8 views
11

Come posso rimuovere i valori da una colonna in pandas.DataFrame, che si verifica raramente, cioè con una bassa frequenza? Esempio:Rimuovere i valori di bassa frequenza da pandas.dataframe

In [4]: df[col_1].value_counts() 

Out[4]: 0  189096 
     1  110500 
     2  77218 
     3  61372 
       ... 
     2065   1 
     2067   1 
     1569   1 
     dtype: int64 

Quindi, la mia domanda è: come rimuovere valori come 2065, 2067, 1569 e gli altri? E come posso fare questo per TUTTE le colonne, che contengono .value_counts() in questo modo?

UPDATE: A proposito di valori 'bassa' intendo come 2065. Questo valore si verifica in col_1 1 (uno) volte e voglio rimuovere valori come questo.

+0

Cosa intendi per "incontrarsi raramente"? Può essere più preciso? Potrebbe essere utile aggiungere del codice già provato. – guaka

+0

Non riesco a capire come può essere "più specifico"? Nel valore '' 'col_1''' come' '' 0''' incontriamo '' '189096''' volte. E valore come '' '1569''' si incontra UNO volte. Voglio rimuovere '' '1569''' e altri valori come questo in' '' col_1'''. –

+0

Aha! Intendi "si verifica", non "incontra". – guaka

risposta

13

Vedo che ci sono due modi per farlo.

Per tutta dataframe

Questo metodo rimuove i valori che si ripetono frequentemente nell'intera dataframe. Possiamo farlo senza loop, usando le funzioni integrate per velocizzare le cose.

import pandas as pd 
import numpy as np 

df = pd.DataFrame(np.random.randint(0, high=9, size=(100,2)), 
     columns = ['A', 'B']) 

threshold = 10 # Anything that occurs less than this will be removed. 
value_counts = df.stack().value_counts() # Entire DataFrame 
to_remove = value_counts[value_counts <= threshold].index 
df.replace(to_remove, np.nan, inplace=True) 

colonna per colonna

Questo metodo rimuove le voci che si ripetono frequentemente in ogni colonna.

import pandas as np 
import numpy as np 

df = pd.DataFrame(np.random.randint(0, high=9, size=(100,2)), 
     columns = ['A', 'B']) 

threshold = 10 # Anything that occurs less than this will be removed. 
for col in df.columns: 
    value_counts = df[col].value_counts() # Specific column 
    to_remove = value_counts[value_counts <= threshold].index 
    df[col].replace(to_remove, np.nan, inplace=True) 
+0

Grazie! È anche un lavoro e può aiutare! –

3

Probabilmente non si desidera rimuovere l'intera riga in DataFrame se solo una colonna ha valori inferiori alla soglia, quindi ho semplicemente rimosso questi punti dati e li ho sostituiti con None.

I loop attraverso ogni colonna ed eseguire uno value_counts su ciascuna. Quindi ottengo i valori di indice per ogni articolo che si verifica a o al di sotto dei valori di soglia di destinazione. Infine, utilizzo .loc per individuare i valori di questi elementi nella colonna e quindi li sostituisco con None.

df = pd.DataFrame({'A': ['a', 'b', 'b', 'c', 'c'], 
        'B': ['a', 'a', 'b', 'c', 'c'], 
        'C': ['a', 'a', 'b', 'b', 'c']}) 

>>> df 
    A B C 
0 a a a 
1 b a a 
2 b b b 
3 c c b 
4 c c c 

threshold = 1 # Remove items less than or equal to threshold 
for col in df: 
    vc = df[col].value_counts() 
    vals_to_remove = vc[vc <= threshold].index.values 
    df[col].loc[df[col].isin(vals_to_remove)] = None 

>>> df 
     A  B  C 
0 None  a  a 
1  b  a  a 
2  b None  b 
3  c  c  b 
4  c  c None 
+0

Grazie! Questo esattamente quello che ho chiesto –

Problemi correlati