Pythonのデータ分析ライブラリpandas
を使うと、データの加工、集計、可視化などを効率的に実行することができます。
加工したSeries
やDataFrame
を文字列に変換して出力したいこともありますよね。
しかし、実際に文字列に変換しようとしても次のような問題に直面することも…:
DataFrame
を文字列に変換するメソッドは何?- ヘッダーやインデックスの有無を変更したい!
- 出力フォーマットをを調整することはできる?
そこで、この記事ではDataFrame
を文字列に変換する方法について詳しく解説します。
- DataFrameを文字列に変換する方法|.to_string()
- to_string()の代表的な引数一覧
- 見出しの出力有無
- 出力行・列の制限
- 列幅・表示位置の設定
- フォーマット関数と書式指定子
- Excel形式で出力する方法
- オススメ|pandasとデータ分析の勉強方法
DataFrameを文字列に変換する方法|.to_string()
pandas
のDataFrame
を文字列に変換するには、to_string()
メソッドを使用します。
このメソッドでは、引数を使って出力形式をカスタマイズすることもできます。
まずは、サンプルコードでto_string()
メソッドの基本的な使い方を確認してみましょう。
import pandas as pd
df = pd.DataFrame({
"Ind": ["Data1", "Data2", "Data3"],
'A': [1, 2, 3],
'B': [4, 5, 6],
'C': [7, 8, 9]
}).set_index("Ind")
# .to_string()でDataFrameを文字列に変換
s = df.to_string()
# 型の確認
type(s)
# str
# sの中身の確認
s
# ' A B C\nInd \nData1 1 4 7\nData2 2 5 8\nData3 3 6 9'
.to_string()
を使うとDataFrame
が文字列に変換されています。
あくまで文字列なので改行は改行コード\n
として格納されていますね。
print()
関数で出力したり、テキストファイルとして出力したりすると、改行コードは展開されて改行になります。
print(s)
# A B C
# Ind
# Data1 1 4 7
# Data2 2 5 8
# Data3 3 6 9
DataFrame
を文字列に変換して加工したいときには、便利なメソッドですね。
以下では、引数を指定子して.to_string()
の出力文字列をカスタマイズする方法を紹介していきます。
to_string()の代表的な引数一覧
to_string()
メソッドの引数を設定して出力形式をカスタマイズできます。
主な引数は次の通りです。
分類 | 設定内容 | 引数名 | 設定例(太字:デフォルト) |
---|---|---|---|
見出し | ヘッダー(列名)の出力 | header |
True |
インデックス(行名)の出力 | index |
True | |
インデックス名の出力 | index_names |
True | |
出力制限 | 出力する列の指定 | columns |
[列名のリスト] : 表示列を指定可 |
出力する最大行数 | max_rows |
数値 を指定 |
|
出力する最大列数 | max_cols |
数値 を指定 |
|
列の書式変更 | 列の最大幅 | max_colwidth |
数値 を指定可 |
列の最小幅 | col_space |
数値 , [リスト] , or{列名:数値の辞書} で指定 |
|
列の表示位置 | justify |
'right' , 'left' , "center" 等が設定可能 |
|
書式詳細 | 欠損値の表記 | na_rep |
'NaN' 任意の文字列に変更可能 |
データのフォーマット変更 | formatters |
フォーマット関数で出力形式を変更 | |
浮動小数点数の出力形式 | float_format |
書式指定子で数値の出力形式を変更 |
以下では、各設定方法について詳しく解説していきます。
見出しの出力有無
ヘッダー、インデックスなど見出し関係の引数は次の通りです。
設定内容 | 引数名 | 設定例(太字:デフォルト) |
---|---|---|
ヘッダー(列名)の出力 | header |
True |
インデックス(行名)の出力 | index |
True |
インデックス名の出力 | index_names |
True |
True
, False
で表示/非表示を切り替えます。
サンプルコードで挙動を確認してみましょう。
s = df.to_string()
print(s)
# A B C
# Ind
# Data1 1 4 7
# Data2 2 5 8
# Data3 3 6 9
s = df.to_string(header=False, index=False)
print(s)
# 1 4 7
# 2 5 8
# 3 6 9
ヘッダー、インデックスの表示/非表示の設定用引数は次の図のように対応しています。
- 【参考】
pandas
のインデックスの基本については、次の記事を参考にしてください。
出力行・列の制限
出力行・列の制限に関する引数は次の通りです。
設定内容 | 引数名 | 設定例(太字:デフォルト) |
---|---|---|
出力する最大行数 | max_rows |
無制限 数値を指定して設定可 |
出力する最大列数 | max_cols |
無制限 数値を指定して設定可 |
出力する列の指定 | columns |
None : 全列, [列名のリスト] で表示列を指定可能 |
行数、列数が多すぎる場合には、これらの引数を使用します。
次のような10行、10列のサンプルデータを使って挙動を確認してみましょう。
import string
import numpy
alphabet_list = list(string.ascii_uppercase)
n = 10
x = np.arange(n)
df = pd.DataFrame(np.dot(x.reshape(n,1), x.reshape(1,n)), columns=alphabet_list[:n])
# A B C D E F G H I J
# 0 0 0 0 0 0 0 0 0 0 0
# 1 0 1 2 3 4 5 6 7 8 9
# 2 0 2 4 6 8 10 12 14 16 18
# 3 0 3 6 9 12 15 18 21 24 27
# 4 0 4 8 12 16 20 24 28 32 36
# 5 0 5 10 15 20 25 30 35 40 45
# 6 0 6 12 18 24 30 36 42 48 54
# 7 0 7 14 21 28 35 42 49 56 63
# 8 0 8 16 24 32 40 48 56 64 72
# 9 0 9 18 27 36 45 54 63 72 81
出力する最大行数を6行に、列数を4列に設定してみましょう。
s = df.to_string(max_rows=6, max_cols=4)
print(s)
# A B ... I J
# 0 0 0 ... 0 0
# 1 0 1 ... 8 9
# 2 0 2 ... 16 18
# .. .. .. ... .. ..
# 7 0 7 ... 56 63
# 8 0 8 ... 64 72
# 9 0 9 ... 72 81
出力数を制限すると、コンソールで表示するときなどにみやすくなりますね。
次に出力する列を指定してみます。
s = df.to_string(columns=["A", "C", "F"])
print(s)
# A C F
# 0 0 0 0
# 1 0 2 5
# 2 0 4 10
# 3 0 6 15
# 4 0 8 20
# 5 0 10 25
# 6 0 12 30
# 7 0 14 35
# 8 0 16 40
# 9 0 18 45
指定した列のみが出力されていますね、結果を整理して出力する際に便利です。
列幅・表示位置の設定
列の幅や左右の表示位置の設定は次の通りです。
設定内容 | 引数名 | 設定例 |
---|---|---|
列の最大幅 | max_colwidth |
数値 を指定可 |
列の最小幅 | col_space |
数値 , [リスト] , or {列名:数値の辞書} で指定 |
列の表示位置 | justify |
'left' , 'right' , "center" 等が設定可能 |
サンプルデータで列幅・表示位置の設定について、挙動を確認してみましょう。
df = pd.DataFrame({
"Ind": ["Data1", "Data2"],
'A': [1, 1],
'B': [123456789, 123456789],
}).set_index("Ind")
# A B
# Ind
# Data1 1 123456789
# Data2 1 123456789
列幅の設定方法
デフォルトでは、列の幅は自動で調整されますが、max_colwidth
とcol_space
で列の幅を指定できます。
max_colwidth
で指定した列幅最大値を超える場合は、データの一部が省略されます。
s = df.to_string(max_colwidth=8)
print(s)
# A B
# Ind
# Data1 1 1234...
# Data2 1 1234...
"B"
列の後半が省略されていますね。
col_widthは、列幅の最小値を指定する際に使用します。
s = df.to_string(col_space=10)
print(s)
# A B
# Ind
# Data1 1 123456789
# Data2 1 123456789
"A"
列の幅が大きくなっていますね。
左右の表示位置変更
justify
引数を用いて、列の表示位置を変更することができます。
デフォルトでは基本的に'right'
となっており、右寄せで出力されます。
指定できる値は次の通りです。
値 | 説明 |
---|---|
'left' |
左寄せ |
'right' |
右寄せ |
'center' |
中央寄せ |
サンプルコードで挙動を確認してみましょう。
### 左右の表示位置変更例
df = pd.DataFrame({
'___A___': [1, 1],
'___B___': ["abc", "abc"],
})
# 右寄せ(デフォルト)
s = df.to_string()
print(s)
# ___A___ ___B___
# 0 1 abc
# 1 1 abc
# 左寄せ
s = df.to_string(justify="left")
print(s)
# ___A___ ___B___
# 0 1 abc
# 1 1 abc
# 中央
s = df.to_string(justify="center")
print(s)
# ___A___ ___B___
# 0 1 abc
# 1 1 abc
さらに詳細な書式指定は、フォーマット関数や書式指定子で設定することができます。
フォーマット関数と書式指定子
さらに詳細な書式指定は、フォーマット関数や書式指定子で設定することができます。
次のサンプルデータで、各種設定方法について解説していきます。
df = pd.DataFrame({
"Ind": ["Data1", "Data2", "Data3"],
'A': [1, 2, 3],
'B': [4, 5, 6],
'C': [7, 8, 9]
}).set_index("Ind")
データの出力式変更
formatters
引数を使用すると、任意のフォーマット関数を適用してフォーマットを変更できます。
formatters = [format関数のリスト]
or
= {"列名": format関数の辞書}
このとき、フォーマット関数は次のように作成します。
formatter( 各セルのデータ ) → フォーマット後の文字列
- 結果は、
"文字列"
として返す必要あり
- 結果は、
サンプルコードで挙動を確認してみましょう。まずはフォーマット関数を用意します、
def format_a(value):
return f'A_{value}'
def format_b(value):
return f'{value}_B'
{"列名": format関数の辞書}
を渡す例を確認してみます。
formatters = {
'A': format_a,
'B': format_b
}
s = df.to_string(formatters=formatters)
print(s)
# A B C
# Ind
# Data1 A_1 4_B 7
# Data2 A_2 5_B 8
# Data3 A_3 6_B 9
'A'列
、'B列'
のフォーマットが変更されていますね。
[format関数のリスト]
を渡す例を確認してみます。
[リスト]
で渡す場合は、列数分のフォーマット関数を渡す必要があります。
formatters = [format_a, format_b, None]
s = df.to_string(formatters=formatters)
print(s)
# A B C
# Ind
# Data1 A_1 4_B 7
# Data2 A_2 5_B 8
# Data3 A_3 6_B 9
フォーマットを適用しない列には、None
を指定しておきましょう。
数値の出力形式変更
float_format
引数を使用すると、数値の出力形式をカスタマイズできます。
次のような%で始まる書式指定子を使用して、フォーマットを変更できます。
書式指定子 | 説明 | 使用例 |
---|---|---|
%d |
整数 | 整数で出力:float_format=%d |
%f |
浮動小数点数 | 小数点2ケタまで出力:float_format=%.2f |
%e |
指数表記 | 小数点2ケタまで出力:float_format=%.2e |
%g |
浮動小数点数または指数表記 | 小数点、指数を自動選択:float_format=%g |
書式指定子は、次のように全体の文字数、小数点以下の文字数を指定することも可能です。
全体の文字数.小数点以下の文字数%指定子
サンプルコードで、使用方法を確認してみましょう。
import numpy as np
df = pd.DataFrame({
'A': [1, 2.345, 0.0000123],
'B': [np.pi, np.e, None],
})
整数、浮動小数、指数でそれぞれ表示してみます。
# 整数で出力
print(df.to_string(float_format='%d'))
# A B
# 0 1 3
# 1 2 2
# 2 0 NaN
# 小数点2ケタまで出力
print(df.to_string(float_format='%.2f'))
# A B
# 0 1.00 3.14
# 1 2.35 2.72
# 2 0.00 NaN
# 指数で出力
print(df.to_string(float_format='%.3e'))
# A B
# 0 1.000e+00 3.142e+00
# 1 2.345e+00 2.718e+00
# 2 1.230e-05 NaN
# 小数または指数を自動選択
print(df.to_string(float_format='%g'))
# A B
# 0 1 3.14159
# 1 2.345 2.71828
# 2 1.23e-05 NaN
DataFrame
を文字列に変更する際には、様々な文字列処理をしたいことが多いと思います。
こういった書式の指定も覚えておくと便利ですね。
Excel形式で出力する方法
to_string()
は、df
を文字列に変換する際には便利です。
その他の形式で出力する場合は、適切なメソッドを使用しましょう。
例えば、Excel形式で出力する場合は、to_excel()
メソッドを使います。
オススメ|pandasとデータ分析の勉強方法
今回はpandas
の重複処理について図解付きで解説しました。
pandas
は便利すぎて操作方法がわかりにくいことがよくあります…。
結局はコツコツ学ぶのが、pandas
マスターの近道ですよね!
データ分析初心者の方にはこちらの記事もおススメです。
私がこれまで勉強してきた経験をもとに考えたおススメの勉強本の紹介記事です。
何から始めて、どうやってレベルアップしていけばいいのか、初心者の方にぜひおススメしたい本を紹介しました。
オススメのpandas
本については、次の記事で紹介しています。