Python|Pandasデータフレームのファイル出力・読込

スポンサーリンク
スポンサーリンク

CSVファイル

読込

pd.read_csv('ファイル名')

  • 一行目(ヘッダー行)をカラム名としない場合はheader=Noneとする。デフォルトは一行目がカラム名になる。
  • カラム名を指定する場合は、names=('A', 'B', 'C', 'D')とタプル型で設定する。
# 自動的に一行目がカラム名になる
df = pd.read_csv('filename.csv')

# カラム名なし
df = pd.read_csv('filename.csv', header=None)

# カラム名を指定
df = pd.read_csv('filename.csv', names=('A', 'B', 'C', 'D'))

# インデックスを指定(0列目)
df = pd.read_csv('filename.csv', index_col=0)

保存(出力)

df.to_csv(ファイル名)

  • カラム名(ヘッダー)を出力させない場合は、header=Falseとする。
  • インデックスの列を出力させない場合は、index=Falseとする。
  • 出力ファイルの文字コードを指定する場合は、encoding="shift_jis"などとする。
# 保存
df.to_csv("filename.csv")

# ヘッダーとインデックを含めない
df.to_csv("filename.csv", header=False, index=False)

# 文字コードを指定する(読み込むファイルの文字コードを指定する
df.to_csv("filename.csv", encoding="shift_jis")

EXCELファイル

読込

単一シートの読込

pd.read_excel('ファイル名')

  • この関数は別途ライブラリが必要で、 ‘xlrd’をインストールしておきましょう。
    pip install xlrd
  • インデックスを指定する場合は、index_col=0と列番号を設定します。
    [0,1]のようにリスト型で指定すると、複数のインデックス(マルチインデックス)になります。
  • header=Noneとすると一行目からデータとなり、カラム名は連番になります。
  • dtype={'カラム名': str, 'カラム名': float}のようにデータ型(タイプ)を指定して読み込むことができます。
  • シート名を指定する場合は、sheet_name=シート番号とまたはsheet_name='シート名'とします。
test.xlsxのSheet1
aaabbbccc
123
456
print(pd.read_excel('test.xlsx'))
#    aaa  bbb  ccc
# 0    1    2    3
# 1    4    5    6

print(pd.read_excel('test.xlsx', index_col=0))
#      bbb  ccc
# aaa          
# 1      2    3
# 4      5    6

複数シートの読込

pd.read_excel('ファイル名', sheet_name=シート名のリスト型)

  • シート名をリスト型で指定します。この場合も、シート番号もOKです。
  • 返り値は、連想配列になっていますので、シート名(シート番号を指定した場合はシート番号)を指定すると、個別のデータフレームを取得することができます。
  • index_colでインデックスを指定することができますが、シート個別にはできません。
  • すべてのシートを読み込む場合は、sheet_name=Noneとします。返り値の連想配列はシート名で指定します。
print(pd.read_excel('test.xlsx', sheet_name=["Sheet1", "Sheet2"]))
# OrderedDict([('Sheet1',    aaa  bbb  ccc
# 0    1    2    3
# 1    4    5    6), ('Sheet2',    aaa  bbb  ccc
# 0    1    2    3
# 1    4    5    6)])

df_array = pd.read_excel('test.xlsx', sheet_name=["Sheet1", "Sheet2"])
print(df_array["Sheet1"])
#    aaa  bbb  ccc
# 0    1    2    3
# 1    4    5    6

print(df_array["Sheet2"])
#    aaa  bbb  ccc
# 0    1    2    3
# 1    4    5    6

df_array = pd.read_excel('test.xlsx', index_col=0, sheet_name=["Sheet1", "Sheet2"])
print(df_array["Sheet1"])
#      bbb  ccc
# aaa          
# 1      2    3
# 4      5    6

print(df_array["Sheet2"])
#      bbb  ccc
# aaa          
# 1      2    3
# 4      5    6

保存(出力)

新規ファイルで出力

df.to_excel('ファイル名')

  • この関数は別途ライブラリが必要で、 ‘openpyxl’ or ‘xlsxwriter’のどちらかをインストールしておきましょう。
    pip install openpyxl
    pip install xlsxwriter
  • シート名を指定する場合は、sheet_nameとします。日本語も大丈夫でした。
  • インデックス(行名)やカラム(列名)を出力させない場合は以下のように引数を指定する。
    例)インデックスが不要な場合:df.to_excel("filename.xlsx", index=False)

    • インデックス:index=False
    • カラム: header=False
df = pd.DataFrame([[1,2,3],[4,5,6]], columns = ["aaa", "bbb", "ccc"]) # リスト型のデータで作成
df = df.set_index('aaa')

print(df)
#      bbb  ccc
# aaa          
# 1      2    3
# 4      5    6

df.to_excel('test1.xlsx')

# シート名を指定
df.to_excel('test2.xlsx', sheet_name='シート名')

複数のデータフレームを出力

  • withで新規にファイルを作成し、データフレームを追加(出力)していきます。
  • 追加する際に、シート名を指定しないと上書きされるので2番目以降は必ず指定します。
df = pd.DataFrame([[1,2,3],[4,5,6]], columns = ["aaa", "bbb", "ccc"]) # リスト型のデータで作成
df = df.set_index('aaa')

print(df)
#      bbb  ccc
# aaa          
# 1      2    3
# 4      5    6

df2 = df.copy()
df2 = df2 + 1
print(df2)
#      bbb  ccc
# aaa          
# 1      3    4
# 4      6    7

# 複数のデータフレームを出力
with pd.ExcelWriter('test3.xlsx') as writer:
    df.to_excel(writer, sheet_name='sheet1')
    df2.to_excel(writer, sheet_name='sheet2')

既存のファイルに出力

  • withで既存のファイルを開き、データフレームを追加(出力)していきます。
  • シート名が重複した場合は自動的に他のシート名になります。
with pd.ExcelWriter('test.xlsx', mode='a') as writer:  
    df.to_excel(writer)

JSONファイル

読込

pd.read_json('ファイル名')

  • ファイルが圧縮されている場合は、compression='gzip'と指定する。
    種類:{‘infer’, ‘gzip’, ‘bz2’, ‘zip’, ‘xz’,}
  • orientstrでJSONの形式を指定できる。(次の「出力」のところで詳細を紹介しています。)
    • ‘split’ : dict like {index -> [index], columns -> [columns], data ->[values]}
    • ‘records’ : list like [{column -> value}, … , {column -> value}]
    • ‘index’ : dict like {index -> {column -> value}}
    • ‘columns’ : dict like {column -> {index -> value}}
    • ‘values’ : just the values array
test.json
{
  "bbb": {
    "1": 2,
    "4": 5
  },
  "ccc": {
    "1": 3,
    "4": 6
  }
}
df = pd.read_json('test.json')
print(df)
#    bbb  ccc
# 1    2    3
# 4    5    6

df = pd.read_json('test.gzip', compression='gzip')
print(df)
#    bbb  ccc
# 1    2    3
# 4    5    6

保存(出力)

新規ファイルで出力

df.to_json(ファイル名)

  • orientstrでフォーマット(形式)を指定することができます。後ほど説明します。デフォルトはcolumnsです。
  • compressionでデータを圧縮することができます。
    種類:{‘infer’, ‘gzip’, ‘bz2’, ‘zip’, ‘xz’}
df = pd.DataFrame([[1,2,3],[4,5,6]], columns = ["aaa", "bbb", "ccc"])
df = df.set_index('aaa')

print(df)
#      bbb  ccc
# aaa          
# 1      2    3
# 4      5    6

print(df.to_json())
# {"bbb":{"1":2,"4":5},"ccc":{"1":3,"4":6}}

df.to_json("test.json")
orientstrのフォーマット(形式)
  • ‘split’ : dict like {‘index’ -> [index], ‘columns’ -> [columns], ‘data’ -> [values]}
  • ‘records’ : list like [{column -> value}, … , {column -> value}]
  • ‘index’ : dict like {index -> {column -> value}}
  • ‘columns’ : dict like {column -> {index -> value}}*デフォルト
  • ‘values’ : just the values array
  • ‘table’ : dict like {‘schema’: {schema}, ‘data’: {data}}

少しわかりにくいので、以下に出力してみました。json.dumps(json.loads())で整形しています。

print(json.dumps(json.loads(df.to_json(orient='split')), indent=2))
# {
#   "columns": [
#     "bbb",
#     "ccc"
#   ],
#   "index": [
#     1,
#     4
#   ],
#   "data": [
#     [
#       2,
#       3
#     ],
#     [
#       5,
#       6
#     ]
#   ]
# }

print(json.dumps(json.loads(df.to_json(orient='records')), indent=2))
# [
#   {
#     "bbb": 2,
#     "ccc": 3
#   },
#   {
#     "bbb": 5,
#     "ccc": 6
#   }
# ]

print(json.dumps(json.loads(df.to_json(orient='index')), indent=2))
# {
#   "1": {
#     "bbb": 2,
#     "ccc": 3
#   },
#   "4": {
#     "bbb": 5,
#     "ccc": 6
#   }
# }

print(json.dumps(json.loads(df.to_json(orient='columns')), indent=2))
# {
#   "bbb": {
#     "1": 2,
#     "4": 5
#   },
#   "ccc": {
#     "1": 3,
#     "4": 6
#   }
# }

print(json.dumps(json.loads(df.to_json(orient='values')), indent=2))
# [
#   [
#     2,
#     3
#   ],
#   [
#     5,
#     6
#   ]
# ]

print(json.dumps(json.loads(df.to_json(orient='table')), indent=2))
# {
#   "schema": {
#     "fields": [
#       {
#         "name": "aaa",
#         "type": "integer"
#       },
#       {
#         "name": "bbb",
#         "type": "integer"
#       },
#       {
#         "name": "ccc",
#         "type": "integer"
#       }
#     ],
#     "primaryKey": [
#       "aaa"
#     ],
#     "pandas_version": "0.20.0"
#   },
#   "data": [
#     {
#       "aaa": 1,
#       "bbb": 2,
#       "ccc": 3
#     },
#     {
#       "aaa": 4,
#       "bbb": 5,
#       "ccc": 6
#     }
#   ]
# }

HTML

保存(出力)

インデックス・カラム名の出力の有無やID/Classの指定など、仕様に関しては細かくあるようですが、あまり利用シーンを思い浮かばないので割愛します。

以下がドキュメントですので参考にしてください。

pandas.DataFrame.to_html — pandas 1.2.4 documentation
import pandas as pd

df = pd.DataFrame([[1,2,3],[4,5,6]], columns = ["aaa", "bbb", "ccc"]) # リスト型のデータで作成
df = df.set_index('aaa')

print(df)
#      bbb  ccc
# aaa          
# 1      2    3
# 4      5    6

print(df.to_html())
# <table border="1" class="dataframe">
#   <thead>
#     <tr style="text-align: right;">
#       <th></th>
#       <th>bbb</th>
#       <th>ccc</th>
#     </tr>
#     <tr>
#       <th>aaa</th>
#       <th></th>
#       <th></th>
#     </tr>
#   </thead>
#   <tbody>
#     <tr>
#       <th>1</th>
#       <td>2</td>
#       <td>3</td>
#     </tr>
#     <tr>
#       <th>4</th>
#       <td>5</td>
#       <td>6</td>
#     </tr>
#   </tbody>
# </table>

以下の感じになります。(CSSが効いているのでデザインは環境により異なります)

bbbccc
aaa
123
456

 

コメント

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