🐍

(学習ログ)Python002:複数CSVを読み込み、1つのDataFrameに結合して先頭を確認

に公開

1. はじめに

  • この記事の目的

    • 2つのCSVファイルをpandasで読み込み、縦方向に結合(行方向に追加)し、内容の冒頭を確認する最小コードを理解します。
  • この記事の概要

    • pd.read_csv()での読み込み
    • pd.concat()での結合(ignore_index=Trueの意味)
    • 結合後の確認手順(head()shape など)をシンプルに解説します。

2. サンプルコード

コード全文

import pandas as pd

# 1) CSVを2つ読み込む
sample_transaction1 = pd.read_csv('001_サンプル/sample_transaction_data1.csv')
sample_transaction2 = pd.read_csv('001_サンプル/sample_transaction_data2.csv')

# 2) 縦方向(行方向)に結合する
sample_transaction = pd.concat([sample_transaction1, sample_transaction2], ignore_index=True)

# 3) 先頭5行を確認する
sample_transaction.head()

行ごとの説明

  • import pandas as pd

    • データ操作ライブラリpandasをpdという短い名前で使えるようにします。
  • pd.read_csv('...1.csv') / pd.read_csv('...2.csv')

    • 各CSVをDataFrameとして読み込みます。列名や型はCSVの表頭・内容に依存します。
  • pd.concat([df1, df2], ignore_index=True)

    • 2つのDataFrameを「下に積む」ように結合します。
    • ignore_index=Trueにより、新しい連番(0,1,2, …)でインデックスを振り直します。
  • .head()

    • 先頭5行を表示して、読み込みと結合が想定どおりか手早く確認します。

実行結果例

   transaction_id  customer_id      date       item     qty   price
0               1          101  2025-09-25   banana      2     120
1               2          101  2025-09-25     milk      1     180
2               3          203  2025-09-26     bread     1     150
3               4          150  2025-09-26     apple     3     100
4               5          150  2025-09-27  chocolate   2     220

※ あくまで例です。お手元のCSVに合わせて表示内容は変わります。


3. エラーと確認のポイント

代表的なエラー文

  • ファイルが見つからない

    FileNotFoundError: [Errno 2] No such file or directory: '001_サンプル/sample_transaction_data1.csv'
    
    • 原因:相対パスの起点が想定と違う/ファイル名のタイプミス/フォルダ構成が異なる

    • 対策:実行中のカレントディレクトリを確認し、正しい相対パスまたは絶対パスを指定する

      import os
      print(os.getcwd())  # 今いるフォルダを確認
      
  • 文字コードの問題

    UnicodeDecodeError: 'utf-8' codec can't decode byte 0x.. in position ...
    
    • 原因:CSVがUTF-8ではなく、Shift_JIS等で保存されている

    • 対策encodingを指定

      df = pd.read_csv('file.csv', encoding='cp932')  # 日本語WindowsのExcel想定
      
  • 列の不整合(結合時の想定外のNaN)

    • 症状concat後、一方にしかない列がNaNで埋まる

    • 原因:ファイル間で列名や列数が異なる

    • 対策:読み込み前に列名を合わせる/usecols=で必要列に絞る/列のリネームを行う

      df = pd.read_csv('file.csv')
      df = df.rename(columns={'顧客ID': 'customer_id'})
      

よく使う確認メソッドや出力例

  • サイズと列名の確認

    sample_transaction.shape      # (行数, 列数) を確認
    sample_transaction.columns    # 列名一覧を確認
    

    例:

    sample_transaction.shape
    (2000, 6)
    
    sample_transaction.columns
    Index(['transaction_id', 'customer_id', 'date', 'item', 'qty', 'price'], dtype='object')
    
  • ざっと中身を見る(先頭・末尾・情報)

    sample_transaction.head(3)    # 先頭3行
    sample_transaction.tail(3)    # 末尾3行
    sample_transaction.info()     # データ型や欠損状況の概観
    

    例(抜粋):

    <class 'pandas.core.frame.DataFrame'>
    RangeIndex: 2000 entries, 0 to 1999
    Data columns (total 6 columns):
     #   Column          Non-Null Count  Dtype
    ---  ------          --------------  -----
     0   transaction_id  2000 non-null   int64
     1   customer_id     2000 non-null   int64
     2   date            2000 non-null   object
     3   item            1998 non-null   object
     4   qty             2000 non-null   int64
     5   price           2000 non-null   int64
    
  • 欠損や重複の簡易チェック

    sample_transaction.isna().sum()       # 列ごとの欠損数
    sample_transaction.duplicated().sum() # 完全重複行の件数
    
  • 想定型への変換(必要に応じて)

    sample_transaction['date'] = pd.to_datetime(sample_transaction['date'], errors='coerce')
    sample_transaction['qty']  = pd.to_numeric(sample_transaction['qty'], errors='coerce')
    sample_transaction['price']= pd.to_numeric(sample_transaction['price'], errors='coerce')
    

小さなコツ:appendは廃止予定だったため、 複数の結合は常にpd.concat を使うのがベストプラクティスです。ファイルが3つ以上あればlistに入れてconcatしましょう。

# 例:複数ファイルを一括結合
paths = [
    '001_サンプル/sample_transaction_data1.csv',
    '001_サンプル/sample_transaction_data2.csv',
    '001_サンプル/sample_transaction_data3.csv',
]
dfs = [pd.read_csv(p) for p in paths]
sample_transaction = pd.concat(dfs, ignore_index=True)

4. まとめ

  • pd.read_csv()で複数のCSVをDataFrameとして読み込み、pd.concat()縦方向結合できる。
  • ignore_index=True新しい連番インデックスに振り直し、結合後のhead()shapeinfo()最小限の品質チェックができる。
  • 典型的なエラー(パス文字コード列不整合)の原因と、実務的な確認メソッド(欠損・重複・型変換)を使った対処の流れが分かる。

Discussion