概要
pandasのデータフレーム関連で色々と調べたり勉強していたりすると、とりあえずデータフレームを作成するという名目で、適当なデータを格納しなければならない場面に出くわすことがあります。整数ならいくらでもやりようがあるのですが、アルファベットは特に思い浮かばず、これまでずっと手打ちしていました。
大した数ではないのでそんなに時間はかからないのですが、せっかく単純作業の自動化をやろうとしているのに、その勉強過程で単純作業をするのもな……という気持ちになっていました。
ちょっと調べた結果、標準ライブラリにあるstringで解決できたので、記憶の促進と、筆を乾かさないという目的を兼ねて投稿しておきます。
stringモジュール
こちらのサイトによると、かつてstringに実装されていた関数の多くは、strやunicodeオブジェクトにメソッドとして移行されたらしいです。道理であんまり見たことがないなと思いました。
string モジュールは Python の初期バージョンを端緒とします。バージョン 2.0 では、このモジュールのみに実装されていた多くの関数が str と unicode オブジェクトのメソッドに移行されました。
今回はこのstringモジュールに備え付けてある定数のascii_lowercaseを利用していきます。
string.ascii_lowercase
小文字のアルファベットを格納した小文字です。超シンプル。利用するにはあらかじめstringをimportしておく必要があります。
import string
print(string.ascii_lowercase)
print(type(string.ascii_lowercase)
abcdefghijklmnopqrstuvwxyz
<class 'str'>
文字列なので、インデックスを使った表記にも対応しています。
print(string.ascii_lowercase[2])
print(string.ascii_lowercase[8:11])
print(string.ascii_lowercase[::-1])
c
ijk
zyxwvutsrqponmlkjihgfedcba
今回はこれを使いながら、適当なデータフレームを作ってみます。
データフレーム作成
練習がてら、与えられたindex_listとcolumns_listに応じて勝手にアルファベットが割り当てられるように関数を作ってみました。この手の数字を回すのが苦手なので、かなりごちゃついた急造関数になっています。
import pandas as pd
import string
from tabulate import tabulate
def make_variable_alphabet_dataframe(index_size, columns_size):
index_list = [f"index{i}" for i in range(1, index_size+1)]
columns_list = [f"column{i}" for i in range(1, columns_size+1)]
alphabet_list = [list(string.ascii_lowercase[i-(columns_size-1):i+1]) for i in range(columns_size-1, index_size*columns_size, columns_size)]
df = pd.DataFrame(alphabet_list, index=index_list, columns=columns_list)
return df
df1 = make_variable_alphabet_dataframe(3, 4)
print(tabulate(df1, df1.columns, tablefmt='github', showindex=True))
| | column1 | column2 | column3 | column4 |
|--------|-----------|-----------|-----------|-----------|
| index1 | a | b | c | d |
| index2 | e | f | g | h |
| index3 | i | j | k | l |
26よりサイズが大きくなると、Noneが格納されるようです。
df2 = make_variable_alphabet_dataframe(6, 6)
print(tabulate(df2, df2.columns, tablefmt='github', showindex=True))
| | column1 | column2 | column3 | column4 | column5 | column6 |
|--------|-----------|-----------|-----------|-----------|-----------|-----------|
| index1 | a | b | c | d | e | f |
| index2 | g | h | i | j | k | l |
| index3 | m | n | o | p | q | r |
| index4 | s | t | u | v | w | x |
| index5 | y | z | | | | |
| index6 | | | | | | |
正直なんでかはよくわかりません。「当然アルファベットのエラーを吐きます」と書こうとサンプルを動かしてたら動作してしまいました。これが噂の'何故か動く'というヤツなのかもしれません。
listあたりかDataFrame自体の仕様なの?と思って探ってはみたものの、結局わからずじまいです。奥歯に挟まったスルメ程度には気になっているので、ご存知の方はご教示いただけると幸いです。
追記(2020/10/04)
コメントにて情報提供していただきました。データフレームは1行目までの要素数さえ足りていれば、あとは自動的にNoneが格納されるようになっているようです。なので、正確には「1行目が26列以内に収まるような列の設定をすればエラーは吐かない」になると思います。サンプルプログラム含めご投稿いただいているので、詳しくはそちらをご参照ください。
以上です。ご覧いただきありがとうございました。次回はなぜかQiita含めてネット上に情報が少ない気がするgspread_formattingについてです。