Python
 Computer >> コンピューター >  >> プログラミング >> Python

【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. リスト内包表記を使って、1から100までの値をリスト ls に格納します。

  2. lambda式を用いた filter() 関数を適用し、9で割った余りが1になる値だけを抽出します。

  3. 抽出したリスト 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ループで各桁の合計を直接計算する

次に、より直感的で応用範囲が広い方法として、各数値の桁の合計を実際に計算して判定する方法を紹介します。

手順

  1. 結果を格納するための空のリストを作成します。

  2. forループで1から100まで繰り返し処理を行い、各イテレーションの冒頭で digit_sum を0に初期化します。

  3. 元の値 i が変更されないよう、一時変数 temp にコピーします。

  4. whileループ(条件:temp > 0)の中で、剰余演算と整数除算を使って各桁の数字を取り出し、合計 digit_sum を算出します。

  5. if文で digit_sum が1または10であるかを判定し、条件を満たせばその値をリストに追加します。

  6. 最後に、リストから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化により、インデックス付きデータとして後続の分析や加工も容易に行えます。

  1. PandasのSeriesデータをMatplotlibで棒グラフとして描画する方法

    Matplotlibを使ってPandasのSeriesやDataFrameから棒グラフを描画するのは非常に簡単です。本記事では、基本的な手順とサンプルコードを通じて、その方法をわかりやすく解説します。 棒グラフを描画する基本手順 辞書の作成: 1から10までの範囲の値を持つ、複数のキーからなる辞書を作成します。各キーがグラフの系列名になります。 DataFrameの作成: 作成した辞書をもとに、PandasのDataFrameを生成します。 棒グラフの作成: plot()メソッドにkind=barを指定して棒グラフを描画します。 図の表示: show()メソッドを呼び出して、作成したグラフを

  2. 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