2015-09-10 60 views
11

pandas.DataFrameの列から値を削除するにはどうすればよいですか?まれに発生頻度が低いですか?例: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 

、私の質問は:2065, 2067, 1569などのような値を削除する方法?そして、これのような.value_counts()を含むすべての列に対してこれを行うにはどうすればよいですか?

UPDATE: '低' について私は2065のような値を意味します。この値はcol_1で1回発生し、このような値を削除します。

+0

"まれに会う"とはどういう意味ですか?あなたはもっと具体的になりますか?すでに試したコードを追加すると役立ちます。 – guaka

+0

どのように「より具体的」なのか理解できませんか? '' '0'''のような' '' col_1'''値には '' '189096'''時間があります。そして '' '1569''のような価値は1回会う。私は '' '' col_1'''で '' '1569''と他の値を削除したいです。 –

+0

Aha!あなたは「出会う」という意味ではなく、「出会う」という意味です。 – guaka

答えて

13

私はあなたがこれを行うには2つの方法があることがわかります。

全体データフレームについて

この方法は、全体のデータフレームにまれに生じる値を除去します。私たちはループを使わずに、組み込み関数を使って処理を高速化できます。

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) 

列ごと

この方法は、各列にまれに発生するエントリを削除します。

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

ありがとう!それも仕事であり、助けることができます! –

3

1つの列の値がしきい値を下回っている場合は、DataFrameの行全体を削除したくない可能性があるので、これらのデータポイントを削除してNoneに置き換えただけです。

私は各列をループし、それぞれに対してvalue_countsを実行します。次に、目標のしきい値以下で発生する各項目のインデックス値を取得します。最後に、.locを使用して、列内のこれらの要素の値を見つけて、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

ありがとう!それはまさに私が尋ねたもの –

関連する問題