2016-12-23 31 views
1

特定の "TYPE"ワードを開始し、_1を含まない列を削除したいですか?条件に基づいて列を削除する方法

df = 

TYPE_1 TYPE_2 TYPE_3 COL1 
aaa  asb  bbb  123 

結果は次のようになります。列の数が大きい場合

df = 

    TYPE_1 COL1 
    aaa  123 

は現在、私は手動でこれらの列を削除しています、しかし、このアプローチは非常に効率的ではありません。

df = df.drop(["TYPE_2","TYPE_3"], axis=1) 
+0

[パンダに複数の列を削除する]の可能複製(https://stackoverflow.com/q/28538536/1278112) –

答えて

3

リストの理解が使用できます。注:軸= 1は列を参照していることを示し、inplace=Truepandas.DataFrame.dropドキュメントとしても使用できます。

droplist = [i for i in df.columns if i.startswith('TYPE') and '_1' not in i] 
df1.drop(droplist,axis=1,inplace=True) 
+0

なんらかの理由で、名前が「〜」の列に対しては機能しません。 'TYPE_MOD'。したがって、 '_'を含む列は無視されます。どうして? – Dinosaurius

+0

これをテストしたところ、 'TYPE_MOD'という名前の列は削除されました。 'TYPE_MOD'文字列に空白がありますか? 'df.columns [df.columns == 'TYPE_MOD']' – ade1e

2

簡単:

unwanted = [column for column in df.columns 
      if column.startswith("TYPE") and "_1" not in column] 
df = df.drop(unwanted) 
1
t_cols = [c for c in df.columns.values if c.startswith('TYPE_') and not c == 'TYPE_1'] 
df.drop(t_cols) 

ジョブを実行する必要があります

+0

OPは "_1が含まれていない"、 "_1で終わる" ではないと言います。 – DyZ

3

これは、第五の答えですが、私は正規表現と列名によってフィルタリングfilterデータフレーム方式のパワーを披露したかったです。これは、TYPEで始まらないか、_1のどこかにある列を検索します。

df.filter(regex='^(?!TYPE)|_1') 
+0

と入力すると何が得られますかこの正規表現を分解できますか?ありがとう。 – julieth

+1

正規表現は2つの部分が '|'で区切られています。前半は '^(?! TYPE)'です。これは[負の先読み]です(http://stackoverflow.com/questions/899422/regular-expression-for-a-string-that-does-not-start -with-a-sequence)は、TYPEで始まらない式を見つけるために使用されます。 2番目の部分は '_1'との一致を探しています –

関連する問題