列名のテキストをパターンマッチで絞り込みたいケースを考えます。
例えば、以下のような列名を持つデータから、「payment_年」にマッチするものだけを抜き出したいシーンはよく発生します。

  • payment_2014
  • payment_2015
  • payment_2016
  • payment_count_2014
  • payment_count_2015
  • payment_count_2016

対象のデータフレーム:data1

In [8]: data1.head()
Out[8]:
   age  workclass  fnlwgt     education  educational-num      marital-status  \
0   25    Private  226802          11th                7       Never-married
1   38    Private   89814       HS-grad                9  Married-civ-spouse
2   28  Local-gov  336951    Assoc-acdm               12  Married-civ-spouse
3   44    Private  160323  Some-college               10  Married-civ-spouse
4   18          ?  103497  Some-college               10       Never-married

          occupation relationship   race  gender  capital-gain  capital-loss  \
0  Machine-op-inspct    Own-child  Black    Male             0             0
1    Farming-fishing      Husband  White    Male             0             0
2    Protective-serv      Husband  White    Male             0             0
3  Machine-op-inspct      Husband  Black    Male          7688             0
4                  ?    Own-child  White  Female             0             0

   hours-per-week native-country income
0              40  United-States  <=50K
1              50  United-States  <=50K 2 40 United-States >50K
3              40  United-States   >50K
4              30  United-States  <=50K

特定の文字を含む列を選択する

pandasのfilterメソッドを使って、シンプルに記述できます。

例1

#  "edu"を含む列を選択する
data1.filter(regex=("edu"))

例1の結果

          education  educational-num
0              11th                7
1           HS-grad                9
2        Assoc-acdm               12
3      Some-college               10
4      Some-college               10
5              10th                6
...

特定の文字を含む列を選択する(複数文字列指定)

こちらは少し複雑です。
複数文字列を配列に入れて、「OR」を表現する正規表現の特殊文字“|”でつなげています。

例2

#  "capital"もしくは"edu"を含む列を選択する
searchfor = ["capital", "edu"]

data1.filter(regex=("|".join(searchfor)))

例2の結果

          education  educational-num  capital-gain  capital-loss
0              11th                7             0             0
1           HS-grad                9             0             0
2        Assoc-acdm               12             0             0
3      Some-college               10          7688             0
4      Some-college               10             0             0
5              10th                6             0             0
...

特定の文字で始まる列を選択する

“^”を使い、先頭マッチを表現します。

例3

# "e"で始まる列名を選択
data1.filter(regex=("^e"))

例3の結果

          education  educational-num
0              11th                7
1           HS-grad                9
2        Assoc-acdm               12
3      Some-college               10
4      Some-college               10
5              10th                6
...

特定の文字で終わる列を選択する

“$”を使い、末尾マッチを表現します。

例4

# "e"で終わる列名を選択
data1.filter(regex=("e$"))

例4の結果

       age                race income
0       25               Black  <=50K
1       38               White  <=50K 2 28 White >50K
3       44               Black   >50K
4       18               White  <=50K
5       34               White  <=50K
...

複雑なパターンを含む列を選択する

正規表現を用いると、複雑なマッチを指定できます。
例えば、冒頭の例でいうと「payment_(任意の文字列)_2016」にマッチする列名を選択したい場合です。
data1に置き換え、例えば、「e(任意の文字列)a」にマッチする列名を選択します。
任意の文字を表現する“.”と、繰り返しを表現する“*”を組み合わせ、「eの後に任意の文字列が繰り返された後に、aがくる」パターンを作っています。

例5

# 「e(任意の文字列)a」にマッチする列名を選択
data1.filter(regex=("e.*a") )

例5の結果

          education  educational-num    relationship
0              11th                7       Own-child
1           HS-grad                9         Husband
2        Assoc-acdm               12         Husband
3      Some-college               10         Husband
4      Some-college               10       Own-child
5              10th                6   Not-in-family
...

正規表現に特化した内容は後日書こうと思います。
正規表現の種類も知る必要がありますが、特殊文字のエスケープも重要です。
非エンジニア殺しの表現の一つだと感じますが、習得するとかなり便利です。