こしあん
2018-10-08

Pandasで複数の列を値をもとに、新しい列を任意の関数で定義する方法


Pandasで、「列A(文字列)と列B(数字)」を文字列として結合し、新しい列を定義するという操作をしたかったのですが、思ったよりも情報がなくハマったので解説していきたいと思います。

サンプルデータ

次のようなデータを定義しました。コミケのサークルスペースのデータを模したものです。

import pandas as pd

comike = pd.DataFrame({
    "block" : ["A", "A", "あ", "あ", "イ", "イ"],
    "number" : [1, 1, 10, 11, 12, 13],
    "side" : ["a", "b", "a", "b", "a", "b"]
})

print(comike)
  block  number side
0     A       1    a
1     A       1    b
2     あ      10    a
3     あ      11    b
4     イ      12    a
5     イ      13    b

ここから「A-01a」のようなサークルスペースの表記で新しい列を定義したいと思います。一見できそうですが次のようにするのはダメです。

print(comike["block"] + "-" + str(comike["number"]) + comike["side"])
0    A-0     1\n1     1\n2    10\n3    11\n4    12\...
1    A-0     1\n1     1\n2    10\n3    11\n4    12\...
2    あ-0     1\n1     1\n2    10\n3    11\n4    12\...
3    あ-0     1\n1     1\n2    10\n3    11\n4    12\...
4    イ-0     1\n1     1\n2    10\n3    11\n4    12\...
5    イ-0     1\n1     1\n2    10\n3    11\n4    12\...

なんとstr()の部分が複数にマッピングされてしまいました。ちなみにstr()を外すと「数字と文字列を結合できねえぞ」と怒られます。どうすればよいでしょうか?

axis=1を指定したdf.apply+ラムダ式を使おう

axis=1を指定してdf.applyを使うのが正解です。要素ごとではなく、行単位で出力させたいので、axis=1(軸に列)を指定します。

comike["space"] = comike.apply(lambda x: f"{x['block']}-{x['number']:02d}{x['side']}", axis=1)

print(comike)

結果は以下の通りです。

  block  number side  space
0     A       1    a  A-01a
1     A       1    b  A-01b
2     あ      10    a  あ-10a
3     あ      11    b  あ-11b
4     イ      12    a  イ-12a
5     イ      13    b  イ-13b

いい感じにできましたね。このようにlambda関数を用いると操作を任意の関数で定義できるのですが、それを軸指定したapplyで使うというのがポイントです。使う機会かなり多いと思います。

Related Posts

Numpyのみでグループ別に集計し平均を出す方法(for文、Pandasなし)... Numpy配列をグループ別に集計するときに、大抵Pandasを使うのですが、Numpyだけで集計するのってできるのかな?どうやるんだろうという話です。答えは「できます」。one-hotベクトルを使って集計する方法を紹介していきます。 このアイディアはTwitterで教えてもらったものです。教えて...
pandasでグループ別に統計量やヒストグラムを表示する方法... 初投稿です。この記事では、pandasでグループ別に基本統計量(describe)をする方法を紹介します。 テストデータ 以下のようなデータを想定します。ある学校の3つのクラスでテストをしてみました。 A組は40人、平均点は60点、標準偏差は10(分布は正規分布に従うものとする) B組は...
PandasのDataFrameでグループ別にサンプルをN個抜き出す方法... 「PandasでGroupbyでグルーピングしたはいんだけど、そこからグループ別にサンプルを1個、2個…と抜き出す、SQLでよくやるやつってどうやるんだっけ?」ということが気になったので、調べました。ちゃんとした方法があります。 例題 今、中国地方と四国地方の県と面積をDataFrameにして...
統計学や機械学習で使われる分散共分散行列、相関行列とグラム行列の関係... TensorFlowなど分散共分散行列の計算関数が用意されていない場合は、分散共分散行列や相関行列を計算する際に自分で関数を定義しなければいけません。そこでグラム行列から、分散共分散行列、相関行列と派生させて計算する方法を理論を中心に見ていきます。 きっかけは主成分分析を使ったPCA Color...
Tags:

Add a Comment

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