【python】DataFrameの列名を数値からエクセルのようにアルファベット表記に変更するモジュールの紹介

作成モジュール

この記事ではDataFrameの列名をエクセルのアルファベット表記のようにABC…とするモジュールを紹介します。

時間の無い人はコードを丸々コピーして取り込むファイルの部分だけ変更すればとりあえず稼働します!
余裕のある人は改造のためにもぜひコードの中身を理解して得ると幸いです。

この記事の目標
・列名を数字からアルファベットの連続した羅列にする

DataFrameとSeries型の違いがわからない人はまず以下の記事で理解しましょう!!
DataFrameとSeriesの違いを紹介
その他Pythonの記事は以下にまとめています!!

Python記事まとめ

[スポンサーリンク]


完成コード

列名をエクセルのアルファベット列のようにするコードは以下となります。
数値をアルファベットにするモジュールをフル活用して動かしているためという単純なコードです。

import pandas as pd

#数値をアルファベットに変換するモジュール(アスキーコーを利用)
def cv(num):
    if num <= 26:
        return chr(num + 64)
    elif num % 26 == 0:
        first = cv(num // 26 - 1)
        second = chr(90)
        return (first + second)
    else:
        first = cv(num // 26)
        second = cv(num % 26)
        return (first + second)

#csvをDataFrameにする ※任意のファイルに変更
df=pd.read_csv("test.csv",header=None)
print(df)

#列の数だけ数値からをアルファベットに変換してリストに保持
column_name = []
for num in range(1, df.shape[1] + 1):
    column_name.append(cv(num))

#列名を変更
df.columns = column_name
print(df)

test.csvの中身は以下のようになっていて

      0    1      2      3     4     5      6      7   ...    21     22      23      24    25     26     27   28
0  1月  2月  3月  4月  5月  6月  7月  8月 ...   10月  11月  12月   1月   2月   3月   4月   5月
1  1歳  2歳  3歳  4歳  5歳  6歳  7歳  8歳 ...   22歳  23歳  24歳  25歳  26歳  27歳  28歳  29歳

コードを実行すると以下のように列名がABC…と変化していることがわかります。

      A     B    C     D     E      F     G    H   ...     V      W       X        Y      Z     AA    AB    AC
0  1月  2月  3月  4月  5月  6月  7月  8月 ...   10月  11月  12月   1月   2月   3月   4月   5月
1  1歳  2歳  3歳  4歳  5歳  6歳  7歳  8歳 ...   22歳  23歳  24歳  25歳  26歳  27歳  28歳  29歳

 

コードの解説

余裕のある人、改造したい人向けにコードの中身を簡単に紹介していきます。

関数部分

今回の核となる関数cvは数値からアルファベットに変換するモジュールです。

#数値をアルファベットに変換するモジュール
def cv(num):
    if num <= 26:
        return chr(num + 64)
    elif num % 26 == 0:
        first = cv(num // 26 - 1)
        second = chr(90)
        return (first + second)
    else:
        first = cv(num // 26)
        second = cv(num % 26)
        return (first + second)

変換するためにアスキーコードを利用しています。

アスキーコード表:http://www3.nit.ac.jp/~tamura/ex2/ascii.html

上記のアスキーコード表を見ると65はA、90はZであることがわかります。
Pythonでただ65と書いてもただの65という数値として認識されますが、
chrモジュールを用いてchr(65)とするとアスキーコードの65と認識されるのです。
つまりchr(65)はA、chr(90)はZと出力されます。

このように数値を受け取ったらうまい具合にアスキーコードに対応させて返しているだけです。

 

メイン部分

メイン部分はCSV読み込み、数値をアルファベット変換、列名変更を行っているのみです。

#csvをDataFrameにする ※任意のファイルに変更
df=pd.read_csv("test.csv",header=None)
print(df)

#列の数だけ数値からをアルファベットに変換してリストに保持
column_name = []
for num in range(1, df.shape[1] + 1):
    column_name.append(cv(num))

#列名を変更
df.columns = column_name
print(df)

この部分はdf.read_csvを用いて任意のCSVファイルを読み込んでいます。
この時CSVにヘッダーが無いのでヘッダー無いよと指定しています。

#csvをDataFrameにする ※任意のファイルに変更
df=pd.read_csv("test.csv",header=None)
print(df)

 

この部分は列数だけ数値をインクリメント(1,2,3…)してforを繰り返すことで変換し、リストに保持しています。
df.shapedfの行数と列数を返すモジュールでdf.shape[0]は行数、df.shape[1]は列数となります。
今回、Aが1なので1スタートにしており、その代わり終了が1早まるので終了に+1しています。

#列の数だけ数値からをアルファベットに変換してリストに保持
column_name = []
for num in range(1, df.shape[1] + 1):
    column_name.append(cv(num))

この部分は列名を変更しています。
df.columnsにリストを渡すことで全ての列名が変更されます。

#列名を変更
df.columns = column_name
print(df)

 

コメント

  1. […] ・index、columnのリセットする方法 ・index、columnの一部変更、全変更、列内容をindexにセットする方法 ・全てのindexとcolumnの取り出し方 ・columnを数値からアルファベットに変換するモジュール […]

タイトルとURLをコピーしました