pandasのDataFrameから特定の文字列を含むカラムだけを抽出(除外)する

Share Button

これといってなんら難しいことではないのだが。適当にデータフレーム作ってやってみる。

df = pd.DataFrame({
    'userid': ['a'+str(i+1001) for i in range(5)],
    'amount': [100, 1200, 520, 220, 198],
    'categ1_cd': [1, 2, 5, 1, 5],
    'categ2_cd': [25, 10, 11, 3, 7],
    'categ3_cd': [1, 0, 1, 0, 0],
    'manufacturer_cd': [1001, 1024, 1015, 9999, 1001]
})
カテゴリ関連のカラム(categ*_cd)だけ抽出した新しいデータフレームを作るなら、
df2 = df[[v for v in df.columns if v.startswith('categ')]]
でdf.columnsから特定の条件(今回ならstartswith(‘categ’)が条件)を満たした要素だけを並べたリストを作ってdf[[]]に放り込めばいいわけだ。

ということは逆に言うと、categ関連カラムだけを落とすことも簡単にできるというわけだ。
df2 = df[[v for v in df.columns if not v.startswith('categ')]]
こっちの方がよく使ってる気がする。もちろんそれ以外の変数だけ持ったカラムを指定するのもこのdfぐらいの規模なら簡単(df[[‘userid’, ‘amount’, ‘manufacturer_cd’]]で済む)だけど、残すべき変数が多い場合には落とす変数を一括で指定できた方が楽だしね。一時的に作っただけのカラムに全部共通の接頭辞としてアンダーバーかなんかつけといて(_per, _cntみたいな)最後にアンダーバーから始まる変数だけまとめて落とすとかよくやる。

あとはカテゴリカルな変数だけ残すのに「変数名に”_cd”を含むカラムだけを抽出」とかやりたければ、
df2 = df[[v for v in df.columns if v.find('_cd') >= 0]]
で_cdを含むカラムだけを取ってこれる。endswithじゃつまらんのでfindにした。ちなみにcontainsにするとそんなattributeは存在しないと怒られる。

まあ要はどううまく新しい変数リストを作れるかってとこですわな。

style="display:block; text-align:center;"
data-ad-layout="in-article"
data-ad-format="fluid"
data-ad-client="ca-pub-3546003055292762"
data-ad-slot="5749192034">

Share Button

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

This site uses Akismet to reduce spam. Learn how your comment data is processed.