【 Python 入門】CSVファイルを操作する方法を徹底解説!Pandasの使い方も合わせて紹介!

【 Python 初心者向け】CSV ファイルの操作方法を解説!

Python を使った CSV ファイルの操作は、データ分析において非常に重要です。本記事では、 CSV ファイル作成から操作方法までを詳しく解説します。

実行環境

  • Google Colaboratory
  • Python: 3.10.12
  • Windows11

Python の csv モジュールの基本的な使い方

Python には標準ライブラリとして csv があり、これを使うことで簡単に CSV ファイルを読み書きできます。 CSV ファイルは、カンマ(,)で区切られた非常にシンプルな構造のテキストファイルです。

まずは CSV ファイルを作成しましょう。以下のデータは、 Sample High School ( S 高校)の体力測定結果を記録した架空のデータです。下記のデータを「メモ帳」にコピーして「 sample.csv 」という名前で保存してください。後に参考画像を載せます。

sample.csv
ID,Name,50m Run (seconds),Throwing Distance (m),Side Steps (reps/20s)
1,Taro Yamada,7.5,45,50
2,Hanako Sato,8.2,38,48
3,Ichiro Suzuki,7.8,50,52
4,Misaki Tanaka,8.0,42,47
5,Kenta Takahashi,7.3,48,53
6,Mao Ito,8.1,40,49
7,Yuko Watanabe,7.9,44,51
8,Ryo Nakamura,7.6,46,50
9,Ai Kobayashi,8.3,39,46
10,Daisuke Kato,7.4,47,52

CSV 形式のデータは、テキストエディタやスプレッドシートソフト(例: Excel )で簡単に内容を確認・編集できます。例えば、作成したファイルを Excel で開くと次のように表示されます。

データの列(カラム)は以下の通りです。
ID 個別番号
Name 名前
50m Run (seconds) 50 m走(秒)
Throwing Distance (m) 遠投( m )
Side Steps (reps/20s) 反復横跳び(回/ 20 秒)

IDName50m Run (seconds)Throwing Distance (m)Side Steps (reps/20s)
1Taro Yamada7.54550
2Hanako Sato8.23848
3Ichiro Suzuki7.85052
4Misaki Tanaka8.04247
5Kenta Takahashi7.34853
6Mao Ito8.14049
7Yuko Watanabe7.94451
8Ryo Nakamura7.64650
9Ai Kobayashi8.33946
10Daisuke Kato7.44752
sample.csv

CSV ファイルの読み込み

次に、CSV ファイルを読み込む基本的な方法を紹介します。以下のコードでは、先程作成した sample.csv ファイルを読み込み、各行のデータをリストとして表示します。

読み込み
# csv モジュールをインポート
import csv

# sample.csv を読み込む
with open('sample.csv') as file:
    reader = csv.reader(file)
    for row in reader:
        print(row)

コード解説
with open 文を使ってファイルを開きます。
csv.reader を使ってCSVファイルを行ごとに読み込み、for 文で各行を出力します。

以下の記事では、 for 文を詳しく紹介しています。併せてご覧ください!

出力結果
['ID', 'Name', '50m Run (seconds)', 'Throwing Distance (m)', 'Side Steps (reps/20s)']
['1', 'Taro Yamada', '7.5', '45', '50']
['2', 'Hanako Sato', '8.2', '38', '48']
['3', 'Ichiro Suzuki', '7.8', '50', '52']
['4', 'Misaki Tanaka', '8.0', '42', '47']
['5', 'Kenta Takahashi', '7.3', '48', '53']
['6', 'Mao Ito', '8.1', '40', '49']
['7', 'Yuko Watanabe', '7.9', '44', '51']
['8', 'Ryo Nakamura', '7.6', '46', '50']
['9', 'Ai Kobayashi', '8.3', '39', '46']
['10', 'Daisuke Kato', '7.4', '47', '52']

このように、 CSV ファイルの各行をリストとして取得できます。

CSVファイルへの書き込み

新しくCSVファイルを作成する

次に、 CSV ファイルにリスト形式のデータを書き込む方法を紹介します。ここでは、 with open() 内に ファイルを開くモード 'W' (記述モード)を追加します。学生の名前、年齢、身長、体重といった基礎情報が入るので、ファイル名は「base.csv」とします。

CSVファイル作成
# CSV ファイルにデータを書き込む
data = [
    ['ID', 'Name', 'Age', 'Height', 'Weight'],
    [1, 'Taro Yamada', 16, 170, 65],
    [2, 'Hanako Sato', 16, 160, 55],
    [3, 'Ichiro Suzuki', 17, 175, 68],
    [4, 'Misaki Tanaka', 16, 162, 54],
    [5, 'Kenta Takahashi', 17, 178, 70],
    [6, 'Mao Ito', 16, 165, 57],
    [7, 'Yuko Watanabe', 16, 168, 60],
    [8, 'Ryo Nakamura', 17, 172, 66],
    [9, 'Ai Kobayashi', 16, 158, 52],
    [10, 'Daisuke Kato', 16, 176, 69],
]

with open('base.csv', 'w') as csvfile: # 'w'モードで開く
    writer = csv.writer(csvfile)
    writer.writerows(data)

保存された CSV ファイルを確認します。
以下のデータが作成できました。
ID 個別番号
Name 名前
Age 年齢
Height 身長
Weight  体重

IDNameAgeHeightWeight
1Taro Yamada1617065
–以下省略––以下省略––以下省略––以下省略––以下省略–
base.csv

既存の CSV ファイルにデータを追記する

すでに存在する CSV ファイルにデータを追加したい場合は、ファイルを開くモードを 'a' (追記モード)に変更する必要があります。ここでは新たに 2 名の学生のデータを追加します。

データ追記
# 追加するデータ
new_data = [
['11','Kenji Yamamoto', '7.7', '43', '49'],
['12','Yumi Nakamoto', '8.0', '41', '47']
]

# 'sample.csv'ファイルにデータを追加する
with open('sample.csv', 'a', newline='') as csvfile:  # 'a'モードで開く
    writer = csv.writer(csvfile)
    writer.writerows(new_data)  # 新しいデータを追加

コード解説
newline='' は、書き込み時に余分な改行を防ぐために使用します。

IDName50m Run (seconds)Throwing Distance (m)Side Steps (reps/20s)
10Daisuke Kato7.44752
11Kenji Yamamoto7.74349
12Yumi Nakamoto8.04147
sample.csv

保存された CSV ファイル (sample.csv) を開くと、2 行追加されていることが確認できます。
base.csv も同じように追加しましょう。

データ追記2
# 追加するデータ
new_data = [
    [11, 'Kenji Yamamoto', 16, 174, 67.3],
    [12, 'Yumi Nakamoto', 16, 163, 56.4],

]

# 'base.csv'ファイルにデータを追加する
with open('base.csv', 'a', newline='') as csvfile:  # 'a'モードで開く
    writer = csv.writer(csvfile)
    writer.writerows(new_data)  # 新しいデータを追加
IDNameAgeHeightWeight
10Daisuke Kato1617669
11Kenji Yamamoto7.74349
12Yumi Nakamoto8.04147
base.csv

データの整形とフィルタリング

次に、CSV ファイルから読み込んだデータを整形したり、特定の条件に基づいてフィルタリングする方法を紹介します。
先程は、 csv でCSVファイルを操作する方法をご紹介しましたが、データの整形や分析には、 pandas ライブラリを使うと便利です。

pandas でデータを操作する方法は、こちらの記事をご覧ください。

データの結合

以下のコードでは、先程作成した「 sample.csv 」と「 base.csv 」を、pandas を用いてデータ内の ID と Name で照合し、 1 つの CSV ファイルにまとめます。

結合
# pandas をインポート
import pandas as pd

# ファイル 1 : 体力測定結果のデータ (sample.csv) を読み込む
df_sample = pd.read_csv('sample.csv')

# ファイル 2 : 身長と体重のデータ (base.csv) を読み込む
df_base = pd.read_csv('base.csv')

# ID と名前でデータをマージする
df_merged = pd.merge(df_sample, df_base, on=['ID', 'Name'])

# 結果を表示する
print(df_merged)

# マージされたデータを新しいCSVに保存
df_merged.to_csv('base_sample.csv', index=False)

コード解説
pd.merge は 2 つのデータセットを 1 つにまとめます。
index=False は、データフレームのインデックス(行番号)を CSV ファイルに含めません。

IDName50m Run (seconds)Throwing Distance (m)Side Steps (reps/20s)AgeHeightWeight
1Taro Yamada7.545501617065.0
2Hanako Sato8.238481616055.0
3Ichiro Suzuki7.850521717568.0
4Misaki Tanaka8.042471616254.0
5Kenta Takahashi7.348531717870.0
6Mao Ito8.140491616557.0
7Yuko Watanabe7.944511616860.0
8Ryo Nakamura7.646501717266.0
9Ai Kobayashi8.339461615852.0
10Daisuke Kato7.447521617669.0
11Kenji Yamamoto7.743491617467.3
12Yumi Nakamoto8.041471616356.4
base_sample.csv

保存された CSV(base_sample.csv) を確認して、上記のように出力されれば完璧です!

条件に基づいたデータのフィルタリング

次に、条件に基づいてデータをフィルタリングする方法を紹介します。例えば、 50 m走を 7.5 秒以内に走る学生のデータを抽出するには比較演算子を使用します。複数条件の設定もできます。ここでは、既に読み込み済の変数「 df_merged 」を使用します。

フィルタリング
# 50 m走が 7.5 秒以内の学生を表示する。
filtered_df1 = df_merged[df_merged['50m Run (seconds)'] <= 7.5]
print(filtered_df1)

# 複数条件でのフィルタリング
filtered_df2 = df_merged[(df_merged['50m Run (seconds)'] <= 7.5) & (df_['Weight'] == '70')]
print(filtered_df2)
7.5秒以内でフィルタリングした結果
   ID             Name  50m Run (seconds)  Throwing Distance (m)  \
0   1      Taro Yamada                7.5                     45   
4   5  Kenta Takahashi                7.3                     48   
9  10     Daisuke Kato                7.4                     47   

   Side Steps (reps/20s)  Age  Height  Weight  
0                     50   16     170    65.0  
4                     53   17     178    70.0  
9                     52   16     176    69.0  
7.5秒以内かつ体重70kgでフィルタリングした結果
   ID             Name  50m Run (seconds)  Throwing Distance (m)  \
4   5  Kenta Takahashi                7.3                     48   

   Side Steps (reps/20s)  Age  Height  Weight  
4                     53   17     178    70.0  

比較演算子は、こちらの記事が参考になります。

データの集計と分析

続けて、 CSV ファイルのデータを集計・分析する方法も確認します。

列の平均や合計の計算

データの合計や平均を計算する場合も pandas が役立ちます。平均を求めるには mean を、合計を求めるには sum を使用します。

平均と合計の計算
# 50 m走の平均タイムを計算
average_age = df_merged['50m Run (seconds)'].mean()

# 50 m走の全体合計タイムを計算
total_age = df_merged['50m Run (seconds)'].sum()

print(f'Average Age: {average_age},Total Age: {total_age} ')
出力結果
Average Age: 7.816666666666667,Total Age: 93.80000000000001

平均タイムはおよそ 7.8 秒、 1 人ずつ計測して全員が走り終わるまでにおよそ 93.8 秒かかります。

データの基本統計量の算出

データの基本統計量(平均、中央値、最小値、最大値など)は、 describe を使用して簡単に算出できます。

基本統計量の確認
# 数値データの基本統計量を算出
stats = df_merged.describe()
print(stats)
出力結果
              ID  50m Run (seconds)  Throwing Distance (m)  \
count  12.000000          12.000000              12.000000   
mean    6.500000           7.816667              43.583333   
std     3.605551           0.321455               3.752777   
min     1.000000           7.300000              38.000000   
25%     3.750000           7.575000              40.750000   
50%     6.500000           7.850000              43.500000   
75%     9.250000           8.025000              46.250000   
max    12.000000           8.300000              50.000000   

       Side Steps (reps/20s)        Age      Height     Weight  
count              12.000000  12.000000   12.000000  12.000000  
mean               49.500000  16.250000  168.416667  61.583333  
std                 2.236068   0.452267    6.748176   6.570711  
min                46.000000  16.000000  158.000000  52.000000  
25%                47.750000  16.000000  162.750000  55.750000  
50%                49.500000  16.000000  169.000000  62.500000  
75%                51.250000  16.250000  174.250000  67.250000  
max                53.000000  17.000000  178.000000  70.000000  

補足
count 列に含まれるデータの数
mean 列の平均値
std 標準偏差
min 最小値
max  最大値

カテゴリーデータは、その列に含まれるデータの頻度や種類を describe(include=['O']) で確認できます。 describe(include=['all']) で数値データとカテゴリーデータを同時に表示もできます。

カテゴリーデータの確認
# カテゴリーデータの確認
stats = df_merged.describe(include=['O'])
print(stats)
出力結果
               Name
count            12
unique           12
top     Taro Yamada
freq              1

補足
count 列に含まれるデータの数
unique 列に含まれるデータの種類
top 列の中で最も数の多い unique
freq top の数

データの可視化による傾向の把握

データを視覚的に理解するためには、グラフ化が有効です。ここでは、 matplotlib を使ってデータを可視化する方法を紹介します。

ヒストグラムの作成

まずは 、 matplotlib を使えるようにインポートして、身長をヒストグラムで表現します。

ヒストグラム
# matplotlib をインポート
import matplotlib.pyplot as plt

# ヒストグラムの作成
plt.hist(df_merged['Height'], bins=10, color='skyblue', edgecolor='black')
plt.title('Height Distribaution')
plt.xlabel('Height (cm)')
plt.ylabel('Frequency')
plt.show()

散布図の作成

次に、身長と 50 m走の 2 つの変数間の関係を散布図で表現します。

散布図
# 散布図の作成
plt.scatter(df_merged['Height'], df_merged['50m Run (seconds)'], color='green')
plt.title('Height × 50m Run (seconds)')
plt.xlabel('Height (cm)')
plt.ylabel('50m Run (seconds)')
plt.show()

データの折れ線グラフや棒グラフの描画

データの変化を折れ線グラフや棒グラフで表現もできます。

折れ線グラフ作成
# 折れ線グラフの作成
plt.plot(df_merged['ID'], df_merged['50m Run (seconds)'], marker='o', linestyle='-', color='blue')
plt.title('ID × 50m Run (seconds)')
plt.xlabel('50m Run (seconds)')
plt.ylabel('ID')
plt.xticks(rotation=45)
plt.show()
棒グラフ作成
# 年齢をカウントして棒グラフを作成
df_merged['Age'].value_counts().plot(kind='bar', color='orange')
plt.title('Number of People by Age')
plt.xlabel('Age')
plt.ylabel('Number of People')
plt.show()

「もっと、かっこいいグラフが書きたい!」と思った方は、以下の記事も併せてご覧ください。

CSV ファイルを Excel に変換する方法

最後に、 CSV ファイルを Excel に変換する方法を紹介します。

変換する方法
# CSV を読み込み
df = pd.read_csv('sample.csv')

# エクセルファイルに書き込み
df.to_excel('output.xlsx', index=False)

コード解説
to_excel 関数を使用して、データフレームを Excel 形式に変換して書き出すことができます。

以下のようにして、これまで扱ってきたデータを Excel ファイルに書き込むこともできます。

書き込み
# エクセルファイルに書き込み
df_merged.to_excel('merged.xlsx', index=False)

Python で Excel を操作する方法を詳しく知りたい方は、こちらの記事をご覧ください。

まとめ

今回は、 CSV ファイルの作成から操作する方法までを紹介しました。 Python を使った CSV ファイルの読み書き、そして、 pandas などのライブラリを使用して、データの整形・フィルタリング、データの集計・可視化まで、多岐にわたる操作が可能です。ここで紹介した CSV ファイルの操作が、データ分析を行なう際の一助となれば幸いです!