【Python・Pandas入門】1から100までのマジックナンバーを抽出してSeriesを作成する2つの方法
本記事では、PythonのPandasライブラリを使って、1から100までの数値の中から「マジックナンバー」を抽出し、Seriesとして作成する方法を2つのアプローチで解説します。
ここでいうマジックナンバーとは、各桁の数字の合計が1または10になる数値のことです。たとえば、19は 1 + 9 = 10、28は 2 + 8 = 10 となるためマジックナンバーに該当します。
プログラムを実行すると、以下のような結果が得られます。
magic number series: 0 1 1 10 2 19 3 28 4 37 5 46 6 55 7 64 8 73 9 82 10 91 11 100
それでは、具体的な実装方法を見ていきましょう。
解法1:リスト内包表記とfilter関数を活用する
まずは、リスト内包表記とlambda式を組み合わせたシンプルな方法から紹介します。
手順
リスト内包表記を使って、1から100までの値をリスト
lsに格納します。lambda式を用いた
filter()関数を適用し、9で割った余りが1になる値だけを抽出します。抽出したリスト
lからPandasのSeriesを生成します。
ポイント
「9で割った余りが1」という条件だけでなぜマジックナンバーが抽出できるのでしょうか? それは、任意の整数とその各桁の合計は、9で割った余りが必ず一致するという数学的な性質(デジタルルートの性質)があるためです。したがって、桁の合計が1または10になる数値は、必ず「9で割った余りが1」になります。
コード例
import pandas as pd
# 1〜100までのリストを作成
ls = [i for i in range(1, 101)]
# 9で割った余りが1の値のみを抽出
l = list(filter(lambda i: i % 9 == 1, ls))
# Seriesを生成して表示
print("magic number series:\n", pd.Series(l))
出力結果
magic number series: 0 1 1 10 2 19 3 28 4 37 5 46 6 55 7 64 8 73 9 82 10 91 11 100
わずか数行のコードで目的のSeriesが取得できました。この方法は簡潔ですが、数学的な性質を理解している必要があります。
解法2:forループで各桁の合計を直接計算する
次に、より直感的で応用範囲が広い方法として、各数値の桁の合計を実際に計算して判定する方法を紹介します。
手順
結果を格納するための空のリストを作成します。
forループで1から100まで繰り返し処理を行い、各イテレーションの冒頭で
digit_sumを0に初期化します。元の値
iが変更されないよう、一時変数tempにコピーします。whileループ(条件:
temp > 0)の中で、剰余演算と整数除算を使って各桁の数字を取り出し、合計digit_sumを算出します。if文で
digit_sumが1または10であるかを判定し、条件を満たせばその値をリストに追加します。最後に、リストからSeriesを生成します。
桁の合計を求めるロジック
各桁の数字を取り出すには、次のように10で割った余りと10で割った商を組み合わせます。
while temp > 0:
rem = temp % 10 # 一番下の桁の数字を取り出す
digit_sum = digit_sum + rem
temp = temp // 10 # 処理済みの桁を削除して次の桁へ
コード例
import pandas as pd
l = []
for i in range(1, 101):
digit_sum = 0
temp = i
while temp > 0:
rem = temp % 10
digit_sum = digit_sum + rem
temp = temp // 10
if digit_sum == 1 or digit_sum == 10:
l.append(i)
print("magic number series:\n", pd.Series(l))
出力結果
magic number series: 0 1 1 10 2 19 3 28 4 37 5 46 6 55 7 64 8 73 9 82 10 91 11 100
まとめ
両方の解法とも同じ結果が得られますが、それぞれ特徴があります。
解法1(filter+lambda):コードが短く簡潔。デジタルルートの性質を利用したエレガントな手法です。
解法2(ループで桁和を計算):処理の流れが明確で理解しやすいほか、判定条件を変更すれば別の種類の数(例:桁の合計が特定の値になる数)にも柔軟に対応できます。
用途や可読性の要件に応じて、最適な方法を選択してください。PandasのSeries化により、インデックス付きデータとして後続の分析や加工も容易に行えます。
-
PandasのSeriesデータをMatplotlibで棒グラフとして描画する方法
Matplotlibを使ってPandasのSeriesやDataFrameから棒グラフを描画するのは非常に簡単です。本記事では、基本的な手順とサンプルコードを通じて、その方法をわかりやすく解説します。 棒グラフを描画する基本手順 辞書の作成: 1から10までの範囲の値を持つ、複数のキーからなる辞書を作成します。各キーがグラフの系列名になります。 DataFrameの作成: 作成した辞書をもとに、PandasのDataFrameを生成します。 棒グラフの作成: plot()メソッドにkind=barを指定して棒グラフを描画します。 図の表示: show()メソッドを呼び出して、作成したグラフを
-
Pythonでpandas Seriesから有効な日付だけをフィルタリングする方法
データ分析では、文字列として格納された日付の中から、正しい形式の日付だけを抽出したい場面がよくあります。この記事では、Pythonのpandasと正規表現(reモジュール)を使って、Series内から「YYYY-MM-DD」形式の有効な日付だけをフィルタリングする方法を2通り紹介します。 入力データと期待される出力 次のようなSeriesがあると仮定します。 0 2010-03-12 1 2011-3-1 2 2020-10-10 3 11-2-2 この中で「年4桁・月2桁・日2桁」という形式に合致する有効な日付は、以下の2つです。 0 2010-0