YutaKaのPython教室

Python の文法やライブラリ、API、環境構築について画像・動画・ソースコード付きで徹底解説!

pandas DataFrameを文字列に変換|to_stringをわかりやすく解説

Pythonのデータ分析ライブラリpandasを使うと、データの加工、集計、可視化などを効率的に実行することができます。

加工したSeriesDataFrameを文字列に変換して出力したいこともありますよね。

しかし、実際に文字列に変換しようとしても次のような問題に直面することも…:

  • DataFrameを文字列に変換するメソッドは何?
  • ヘッダーやインデックスの有無を変更したい!
  • 出力フォーマットをを調整することはできる?

そこで、この記事ではDataFrameを文字列に変換する方法について詳しく解説します。

DataFrameを文字列に変換する方法|.to_string()

pandasDataFrameを文字列に変換するには、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のインデックスの基本については、次の記事を参考にしてください。
≫pandas インデックス列の基本操作|要素にアクセス、検索、欠損値処理
pandasのDataFrameでは、インデックス列の操作方法に関して、網羅的に解説!①インデックスの基本構造②インデックス内要素へのアクセス方法③インデックス内のデータ検索、並べ替え、重複処理、欠損値処理。サンプルコード付きでわかりやすく解説!
www.yutaka-note.com/entry/pandas_index_manip
 

出力行・列の制限

出力行・列の制限に関する引数は次の通りです。

設定内容 引数名 設定例(太字:デフォルト
出力する最大行数 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_colwidthcol_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 DataFrameをExcel出力|to_excelわかりやすい図解
pandasのDataFrameは、.to_excel()メソッドを使用すると簡単にExcelの出力できます。この記事では.to_excel()について、次の内容について解説していきます。① Excelの保存先・書き込み方法の設定、② 出力シート、セルの指定、③ 表の見出しの設定、④出力内容の変更(出力列指定、欠損値、無限大、小数点桁数の出力設定)
www.yutaka-note.com/entry/pandas_to_excel
 

オススメ|pandasとデータ分析の勉強方法

今回はpandasの重複処理について図解付きで解説しました。

pandasは便利すぎて操作方法がわかりにくいことがよくあります…。

結局はコツコツ学ぶのが、pandasマスターの近道ですよね!

≫【ブログカテゴリー:pandas】

データ分析初心者の方にはこちらの記事もおススメです。

私がこれまで勉強してきた経験をもとに考えたおススメの勉強本の紹介記事です。

何から始めて、どうやってレベルアップしていけばいいのか、初心者の方にぜひおススメしたい本を紹介しました。

≫独学でデータ分析を勉強するオススメ学習本
独学でのpythonデータ分析勉強に役立ったおススメ書籍を紹介していきます。業務でそれなりにデータ分析を行えるまで、いろいろな試行錯誤をしてきましたが、もし自分が今ゼロから勉強する立場ならどうするのがいいのか考えてみました。以下では、入門書、個別モジュール用、実践用の3つの視点でおススメ本を紹介していきます。
www.yutaka-note.com/entry/data_analysis
 

オススメのpandas本については、次の記事で紹介しています。

≫【レビュー】「Python実践データ分析100本ノック」|100本終えたらpandasが好きになっていた
Python実践データ分析100本ノックで、実際に100本終了したレビューです。pythonでのデータ分析の入門書としてかなりの良書だったと思います。・python2~3冊目に何を勉強しようか迷っている人・時間をかけずにデータ分析の基本を学びたい人・pandasへの抵抗を減らしたい人
www.yutaka-note.com/entry/nock_100
 
≫【レビュー】「Pythonによるデータ分析入門」| pandas開発者によるpandasユーザーのためのpandasの教科書!
「Pythonによるデータ分析入門」を、最初から最後まで実際に実践してみたレビューです。具体的にどのようなことができるようになったかを実例付きで紹介します!・DataFrameの生成方法・欠損値の処理方法・グラフ化の方法気になる学習時間は…?
www.yutaka-note.com/entry/2019/12/07/230219