<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
過去記事。