pandasのデータフレーム内で、特定の文字が含まれる回数をカウントする

pandasのデータフレーム内で、特定の文字が含まれる回数をカウントする処理について考えてみます。

今回は、winemag-data-130k-v2.csvを用いて練習してみます。 ↓下記リンクからDL可能です。 (https://gist.github.com/clairehq/79acab35be50eaf1c383948ed3fd1129)

まずは、データを読み込みます。

import pandas as pd
pd.set_option("display.max_rows", 5)
reviews = pd.read_csv("../input/wine-reviews/winemag-data-130k-v2.csv", index_col=0)
reviews.head()

winemag-data-130k-v2.csvを5行目まで出力した結果

やりたいこと:descriptionの列で"tropical"という文字が出現する回数をカウント

結論からいくと、

n = reviews.description.map(lambda desc: "tropical" in desc).sum()

でカウントすることが可能です。 何やらmap, lambdaなど難しそうな文字が見られます。 それぞれ解説していきます。

mapとは

mapとは、簡単に言えば、「Series(1次元のデータ)の各要素に関数を適用するメソッド」のことをいいます。 Series(1次元のデータ)の各要素を二乗する処理を例に挙げてみました。

import pandas as pd
numbers = pd.Series([1, 2, 3, 4, 5])
def square(x):
    return x ** 2
squared_numbers = numbers.map(square)
print(squared_numbers)

numbersにmap(関数)を適用することで、for文など使わずにデータの処理を一括で行えるようです。 つまり、

n = reviews.description.map(lambda desc: "tropical" in desc).sum()

上記のコードは、descriptionのSeriesに対して、lambda desc: "tropical" in descの関数を適用しているということになります。
では、lambdaとは何なのでしょうか?

lambdaとは

lambdaとは、簡単に言えば、「無名(匿名)関数を作成するためのキーワード」です。
与えられた数値を2倍する処理を例に挙げてみました。

double = lambda x: x * 2
print(double(5))  # 出力: 10

lambdaは、「lambda 引数: 処理」で表されます。
上記の例で言うと、「5という数字を2倍する処理を行う」ということです。
このようにdefで関数を定義しなくても、1行で関数を定義できるようですね。

本題の処理に戻ってみると、
lambda desc: "tropical" in desc
というのは、descにはreviews.descriptionの要素が引数として与えられ、
その中に、"tropical"という文字が入っていた場合に、Trueを返すという関数ということですね。
イメージ的には、下記の通りです。

desc = "tropical orangina"
print("tropical" in desc) # 出力: True

まとめ

特定の列に、条件に合う文字が入っている場合の回数をカウントする処理について見てきました。

n = reviews.description.map(lambda desc: "tropical" in desc).sum()

上記の処理は、
reviews.descriptionでdescriptionのデータを抽出
map()を使用することで、全要素にlambda desc: "tropical" in descという関数を適用
"tropical"という文字が入っていたら、Trueを返す
.sum()でTrueの個数をカウントする
という流れになります。

疑問点などあれば、コメントよろしくお願いします!