<Python, pandas> 要素が全て同じカラムを削る。

要素elementが全て同じカラムcolumnを削る。

2つ技あり。.isin().applymap()

まずはベースのデータフレームDataFrame作成。

In [1]: import pandas as pd

In [3]: df = pd.DataFrame({'a':[1,2,'a'],'b':['a','a','a'],'c':['ab','ab','ab']})

In [4]: df
Out[4]: 
   a  b   c
0  1  a  ab
1  2  a  ab
2  a  a  ab

で、applymap()を使って、columnbの要素aをヒットさせて、dropna()で削る。

In [5]: import numpy as np

In [7]: df.applymap(lambda x: np.nan if str(x) == 'a' else x)
Out[7]: 
     a   b   c
0  1.0 NaN  ab
1  2.0 NaN  ab
2  NaN NaN  ab

In [8]: df.applymap(lambda x: np.nan if str(x) == 'a' else x).dropna(axis=1, how='all')
Out[8]: 
     a   c
0  1.0  ab
1  2.0  ab
2  NaN  ab

isin()の場合。
こいつは、文字列のリストlistを渡してヒットするか?をみるもの。

In [9]: df[ df.isin(['a']) ]
Out[9]: 
     a  b    c
0  NaN  a  NaN
1  NaN  a  NaN
2    a  a  NaN

In [10]: df[ ~df.isin(['a']) ]
Out[10]: 
     a    b   c
0    1  NaN  ab
1    2  NaN  ab
2  NaN  NaN  ab

In [11]: df[ ~df.isin(['a']) ].dropna(axis=1, how='all')
Out[11]: 
     a   c
0    1  ab
1    2  ab
2  NaN  ab

文字列リストの場合。

In [12]: df[ ~df.isin(['a','ab']) ]
Out[12]: 
     a    b    c
0    1  NaN  NaN
1    2  NaN  NaN
2  NaN  NaN  NaN

In [13]: df['d'] = pd.Series(['ab','ac','ad'])

In [14]: df
Out[14]: 
   a  b   c   d
0  1  a  ab  ab
1  2  a  ab  ac
2  a  a  ab  ad

In [15]: df[ ~df.isin(['a','ab']) ]
Out[15]: 
     a    b    c    d
0    1  NaN  NaN  NaN
1    2  NaN  NaN   ac
2  NaN  NaN  NaN   ad

で、正規表現regexpで使って文字列をヒットさせる場合。

In [16]: import re

In [22]: df.applymap(lambda x: np.nan if re.match('a.', str(x)) else x)
Out[22]: 
   a  b   c   d
0  1  a NaN NaN
1  2  a NaN NaN
2  a  a NaN NaN

なるへそ。

マニュアル。

http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.isin.html

過去記事。

nekoyukimmm.hatenablog.com