2015-09-10 8 views
11

Jak usunąć wartości z kolumny z pandas.DataFrame, która występuje rzadko, tzn. Z małą częstotliwością? Przykład:Usuwanie wartości niskiej częstotliwości z 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 

Więc moje pytanie brzmi: jak usunąć wartości jak 2065, 2067, 1569 i innych? I jak mogę to zrobić dla WSZYSTKICH kolumn, które zawierają w ten sposób .value_counts()?

UPDATE: o wartościach 'niski' mam na myśli 2065. Ta wartość występuje w col_1 1 (jeden) razy i chcę usunąć takie wartości.

+0

Co masz na myśli mówiąc "spotykaj się rzadko"? Czy mógłbyś to sprecyzować? Pomocne może być dodanie kodu, który już wypróbowałeś. – guaka

+0

Nie mogę zrozumieć, jak może być "bardziej szczegółowe"? W '' 'col_1''' wartość jak' '0''' spotyka' '' 189096''' razy. A wartość jak "1569" "spotyka się JEDNO razy. Chcę usunąć '' '1569''' i inne podobne wartości w' '' col_1'''. –

+0

Aha! Masz na myśli "występuje", a nie "spełnia". – guaka

Odpowiedz

13

Widzę, że możesz to zrobić na dwa sposoby.

Dla całego DataFrame

Metoda ta usuwa wartości, które pojawiają się często w całym DataFrame. Możemy to zrobić bez pętli, używając wbudowanych funkcji, aby przyspieszyć działanie.

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) 

kolumna po kolumnie

Metoda ta usuwa dane, które występują często w każdej kolumnie.

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

Dziękuję! To też działa i może pomóc! –

3

Prawdopodobnie nie chcesz usunąć całego wiersza w ramce DataFrame, jeśli tylko jedna kolumna ma wartości poniżej twojego progu, więc usunąłem te punkty danych i zastąpiłem je None.

Przeszukuję każdą kolumnę i wykonuję na każdym z nich value_counts. Następnie otrzymuję wartości indeksu dla każdego elementu, który występuje przy lub poniżej docelowych wartości progowych. Wreszcie używam .loc, aby zlokalizować te wartości elementów w kolumnie, a następnie zastąpić je 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

Dziękujemy! Dokładnie to, o co poprosiłem –

Powiązane problemy