今回は製造業で働いているバランが、日頃のデータ分析や自動化する際に使用するPythonコードを、実例を用いて説明していきます。
▼ Contents
1. 製造業における16進数表現
今回はデータ分析で使用する機会がある16進数を10進数に変換する処理コードを検討します。
図1は16進数で表現されたデータですが、製造業では数値結果が16進数であることを示すために、数値結果の最後に文字が記載されることがあります。なお、今回は最後に記載されている文字”HEX”は、16進数を表す”HEX”を使用しました。
桁数の多いデータは16進数で表現されることが多いですが、いざデータ分析後にデータを可視化しようとすると、10進数のほうが都合がよいことがあります。そのため、この16進数で表現されたデータを10進数に変換していきます。
この文字列がデータ処理する際に結構邪魔です。

2. 文字列を含む16進数を10進数に変換する
以下は、変換コード例です。まず、16進数データを作成します。
import pandas as pd
df_16 = pd.DataFrame({'Number': ["0000HEX", "1111HEX", "FFFFHEX"]})
次に、16進数を10進数に変換する関数を作成します。
def base_16ary_to_10ary(df):
""" 16進数のデータを"抽出、整形 """
df["Number"] = df["Number"].str.extract('(\w+)HEX', expand=True)
""" 16進数を10進数(int型)に変換 """
df["Number"] = df["Number"].apply(lambda x: int(x, 16))
""" 変換したDataFrameを戻します """
return df
1行ずつ見ていきましょう。まず、以下のコードで変換関数を定義します。関数名は”base_16ary_to_10ary”としました。引数はデータフレームのみです。
def base_16ary_to_10ary(df):
次の行で、16進数を10進数に変換するために必要なデータ、つまり文字列”HEX”を取り除いたデータを抽出します。
""" 16進数のデータを"抽出、整形 """
df["Number"] = df["Number"].str.extract('(\w+)HEX', expand=True)
データフレームdf中から、”Number”というカラムに対して、正規表現を利用してデータを分けて、再度データフレームdfの”Number”というカラムにデータを代入します。ここでのデータ変換結果は以下のようになります。HEXを取り除けていますね。

(\w+)は、任意の英数字で1回以上の繰り返しのものをグループ化する記載です。HEXはグループ化せず、取り除きます。正規表現が不明な方は、以下のサイトがわかりやすいです。
正規表現の参照リスト
分かりやすいpythonの正規表現の例
あとは、HEXを取り除いた16進数データを10進数(int型)に変換するコードを記載します。
""" 16進数を10進数(int型)に変換 """
df["Number"] = df["Number"].apply(lambda x: int(x, 16))
以上で変換完了です。とても簡単でしたね。
3. 完成版コードとまとめ
完成版コードは以下です。
import pandas as pd
def base_16ary_to_10ary(df):
""" 16進数のデータを"抽出、整形 """
df["Number"] = df["Number"].str.extract('(\w+)HEX', expand=True)
""" 16進数を10進数(int型)に変換 """
df["Number"] = df["Number"].apply(lambda x: int(x, 16))
""" 変換したDataFrameを戻します """
return df
JupyterNotebook(またはJupyterlab)上での出力結果は以下となります。10進数に変換されていますね。
df_16 = pd.DataFrame({'Number': ["0000HEX", "1111HEX", "FFFFHEX"]})
df_10 = base_16ary_to_10ary(df_16)
df_10

もちろん、文字列が含まれていないデータであれば、以下のコードでN進数を10進数に変換することが可能ですので、ぜひお確かめください。
import pandas as pd
def base_Nary_to_10ary(df, N=2):
""" N進数を10進数(int型)に変換 """
df["Number"] = df["Number"].apply(lambda x: int(x, N))
""" 変換したDataFrameを戻します """
return df
df_2 = pd.DataFrame({'Number': ["0000", "1010", "1111"]})
df_10 = base_Nary_to_10ary(df_2, 2)
df_10
これからも、製造業のデータ分析から得た知見や自動化ツールを発信していこうと思います。
それでは。

Twitterもやってまーす。

他の記事もご欄いただけると幸いです。
私の自己紹介ページです。