【Python】csvファイルを使って管理してみる(外部ライブラリ:pandas)

プロモーションが含まれています。

スポンサーリンク
サムネイル Python/MicroPython
スポンサーリンク

外部ライブラリpandasができること

pandasとは

関係性を持ったデータを、簡単かつ直感的、高速かつ柔軟に扱えるようになっています。多くの言語で利用可能な強力で柔軟なオープンソースのデータ分析・操作ツールになることを目標にしています。csvをはじめ、excel、html、json、xml など多くの形式に対応しています。

特徴

沢山ありますが、3点あげておきます。

  • データ内に不明なデータがあっても停止せずに、NaN、Na、NaTとして簡易処理
  • データフレームや高次元オブジェクトから、カラムの追加や変更、削除ができる
  • データ形式に合わせることも、形式を無視して自動的に合わせて計算することができる

詳細は、(公式)Pandas または、 (PyPi) Pandas で確認できます。

スポンサーリンク

今回やってみること

仮の天気情報を作って、できそうなことをひとつずつこなしていきたいと思います。

  • 簡単なcsvファイルを作成
  • 作成したcsvファイルの内容を表示
  • 指定の情報をピックアップ
  • データを変更、データを追記
  • データをcsvファイルに保存

項目4の「csvファイルにデータを変更」は、既に存在しているデータを変更、項目5の「csvファイルにデータを変更」は、新しく2025-04-03のデータを追加してみます。

csvデータ

一番目の項目「簡単なcsvファイルを作成」です。

天気に関するデータを作ってみたいと思います。(仮に作ったデータで、内容は正しくありません。)データは形式はcsvに合わせていますが、編集しやすいように拡張子をcsvではなくtxtにしてあります。

↓↓↓weather-2025.txt↓↓↓

【date】,【week】,【℃-min】,【℃-max】,【Today】,【Tomorrow】
2025-04-01,火,0.0,4.0,雨,雨のち曇り
2025-04-02,水,0.0,8.0,雨のち曇り,曇りのち晴れ

使用したメソッド一覧

動作確認の前に、今回使用したメソッドを簡単に書いておきたいと思います。

読み出し、簡単なデータ選択

メソッド説明動作確認
.read_csvcsvファイルを開く(読み出す)click
.head(n)先頭からn行のデータを表示するclick
.to_csv( )csv形式で保存click

データの選択

メソッド説明動作確認
.at[ , ]インデックス名、カラム名でセルを指定click
.iloc[ , ]数字で行列指定click
.loc[ , ]インデックス名、カラム名で行列を指定click
.DataFrame( , , )データを作成しますclick
.concat([ , ])データを連結するclick
スポンサーリンク

動作確認

Thonnyで確認していきます。

作成したcsvファイルの内容を表示

import pandas as pd

df = pd.read_csv('./weather-2025.txt', sep=',')
a = df.head(2)

print("df\n",df, '\n')
print("a\n",a)

上記プログラムを実行した結果が下の画像です。結果が見やすいようにしていますが、シンプルに表示するだけなら、 print(df)、print(a) で十分です。

結果1-1(シェル)

df も a も同じ結果が表示されているのが分かります。

a = df.head(2) を a = df.head(3) にしても、結果は変わりません。
a = df.head(1) にすると 0行目の2025-04-01だけになります。

a = df.head(0) だと、
Empty DataFrame
Columns: [【date】, 【week】, 【℃-min】, 【℃-max】, 【Today】, 【Tomorrow】]
Index: []
と、表示されました。

上手く検出できないデータ

csvデータの一部を削除して、NaNを表示させてみます。

↓↓↓weather-2025.txt(改)↓↓↓

【date】,【week】,【℃-min】,【℃-max】,【Today】,【Tomorrow】
2025-04-01,火,0.0,4.0,雨,雨のち曇り
2025-04-02,水,0.0,,雨のち曇り,曇りのち晴れ

2025-04-02の【℃-max】が、8.0 になっているのを削除しました。「,8.0,」が「,,」になっています。

結果1-2(シェル)

1行目の2025-04-02の【℃-max】のデータがないので、NaNになっています。

NaNnot a number、非数
NaNot Applicable、非該当、不適用
NaTNot a Time、非時間(時間に関するNaN)

文字数を増やす

カラムの文字数を増やすとどうなるか確認します。

↓↓↓weather-2025-2.txt↓↓↓

【date】,【week】,【temperature-min】,【temperature-max】,【Today’s-weather】,【Tomorrow’s-weather】
2025-04-01,火,0.0,4.0,雨,雨のち曇り
2025-04-02,水,0.0,8.0,雨のち曇り,曇りのち晴れ

最初のプログラムの、
df = pd.read_csv(‘./weather-2025.txt‘, sep=’,’) を
df = pd.read_csv(‘./weather-2025-2.txt’, sep=’,’) に変更して確認します。

項目の内容について、単位を文字にしたり詳しくしたりしてみました。この後も、使うかもしれないのでファイル名を変えました。

結果1-3(シェル)

文字数が多くなるとデータが省略されています。表示後に、実際のデータサイズを [2 rows x 6 columns] で示しているようです。

カラムと不一致のデータ

カラムのデータが6つに対して、データの数を増やすとどうなるか試してみました。

↓↓↓weather-2025.txt(改)↓↓↓

【date】,【week】,【℃-min】,【℃-max】,【Today】,【Tomorrow】
2025-04-01,火,0.0,4.0,雨,雨のち曇り
2025-04-02,水,0.0,8.0,雨のち曇り,曇りのち晴れ,晴れ

1行目のデータ、2025-04-02の最後に「,晴れ」を追加して動作確認すると、エラーになって処理が停止することが分かります。追加した「,晴れ」を削除すると正常に動作します。

メソッド一覧へ

指定の情報をピックアップ

行列を指定したデータ (ピンポイントに指定したデータ)

指定したデータをピックアップします。

import pandas as pd

df = pd.read_csv('./weather-2025.txt', index_col='【date】', sep=',')
a = df.head(2)

print(a, '\n')
print(df.at['2025-04-01', '【week】'])

.atを使ってインデックスとカラムを指定すると、ピックアップできます。日付(【date】)をインデックスだと定義する必要があります。(index_col=’【date】’)

結果2-1(シェル)

全体を表示して、指定のデータをピックアップしました。2025-04-01と【week】で交わるデータの「火」がピックアップできています。

メソッド一覧へ

行または列を指定したデータ

.ilocを使って行と列を指定して表示することができます。

import pandas as pd

df = pd.read_csv('./weather-2025.txt', index_col='【date】', sep=',')
a = df.head(2)

print(a, '\n')
print(df.iloc[[0],:], '\n')
print(df.iloc[[1],:], '\n')
print(df.iloc[:,[0]], '\n')
print(df.iloc[:,[0,2]], '\n')
print(df.iloc[:,[0,2,4]], '\n')

表示結果について解説していきます。【date】がインデックスだと認識させるために、index_col=’【date】’ を追加しています。

print(a)
※見やすいように無関係の表示情報を消しています

結果2-2(シェル)

データ比較用として表示させました。

print(df.iloc[[0],:])
print(df.iloc[[1],:])
※見やすいように無関係の表示情報を消しています

結果2-3(シェル)

表示する行を指定しています。0行目だけ、1行目だけが表示されています。

」は全選択のようです。

print(df.iloc[:,[0]])
print(df.iloc[:,[0,2]])
print(df.iloc[:,[0,2,4]])

※見やすいように無関係の表示情報を消しています

結果2-4(シェル)

表示する列を指定しています。それぞれ、0列目だけ、0列と2列目を、0列と2列と4列目を表示させました。

print(df.iloc[0:1,0:4])
※見やすいように無関係の表示情報を消しています

結果2-5(シェル)

上の結果はオリジナルのデータで、下の結果が今回の結果です。

表示させたい行、列をそれぞれ範囲で指定します。0行目の0~3列目のデータを範囲でしていして表示させます。終了側は表示させたい範囲+1の値を設定します。行は0:1なので0行目を、列は0:4なので0~3列目までのデータを表示させています。

メソッド一覧へ

他にも色々できる

数値を変えてみてどうなるかを確認すると、より理解が深まると思います。また、条件を設定して表示することもできたりと、色々な設定があるので探してみると面白いです。

例えば、インデックスとカラムを指定して表示することもできます。(.loc)

print(df.loc[[‘2025-04-01’], [‘【℃-min】’, ‘【℃-max】’]])

を追記して確認できます。

メソッド一覧へ

データの変更、追加

データを変更

現在、2025-04-02 -【℃-min】のデータが「0.0」。これを「0.5」に変更して再表示します。

import pandas as pd

df = pd.read_csv('./weather-2025.txt', index_col='【date】', sep=',')
a = df.head(2)
print(a, '\n')

b = df.at['2025-04-02', '【℃-min】']
print(b, '\n')

df.at['2025-04-02', '【℃-min】'] = 0.5
print(a, '\n')

結構、単純でした。

結果3-1(シェル)

df.at[‘2025-04-02’, ‘【℃-min】’] を = の左辺に置けば書き換え、右辺に置けば左辺に代入になりました。

df.iloc[1,1] でも同様の処理ができました。

【℃-min】のデータを「0.5」から「1.0」に変更します。

#上記のプログラムに追記して確認できます。
c = df.iloc[1,1]
print(c, '\n')
df.iloc[1,1] = 1.0
print(a, '\n')

元のデータが「0.5」を確認して、「1.0」に変更しました。

結果3-2(シェル)

データを確認すると、「1.0」に変更できているのが確認できます。

データを追加

2025-04-03の(架空)データを追記します。順に「水」「1.0」「8.5」「晴れ」「曇り」というデータとします。

形式を合わせた追加分だけのデータを作って、それを加える(ドッキングする)方法が簡単そうです。

import pandas as pd

df = pd.read_csv('./weather-2025.txt', index_col='【date】', sep=',')
a = df.head(2)
print(a, '\n')

df_add_data_1 = pd.DataFrame([['木', '1.0', '8.5', '晴れ', '曇り']], index = ['2025-04-03'], columns = ['【week】', '【℃-min】', '【℃-max】', '【Today】', '【Tomorrow】'])
print('「df_add_data_1」\n', df_add_data_1, '\n')

df_add_data_2 = pd.DataFrame([['木', '1.0', '8.5', '晴れ', '曇り'], ['金', '1.5', '10.0', '曇り', '晴れ']], index = ['2025-04-03', '2025-04-04'], columns = ['【week】', '【℃-min】', '【℃-max】', '【Today】', '【Tomorrow】'])
print('「df_add_data_2」\n', df_add_data_2, '\n')

df_add_linedata = pd.concat([df, df_add_data_2])
print('「New_data」\n',df_add_linedata, '\n')

追加分だけのデータを「df_add_data_1」と「df_add_data_2」のふたつ作ってみました。

実際に使うデータは「df_add_data_2」で、「df_add_data_1」は確認用です。

df

結果3-3(シェル)

確認用です。

df_add_data_1df_add_data_2

結果3-4(シェル)

df_add_data_1 も df_add_data_2 も、.DataFrame でデータを直接書きながら作りましたが、見やすくすることを目的に、変数でデータを作って .DataFrame では変数を入れ込むという方法もできます。

元々のデータは、

df_add_data_2 = pd.DataFrame([['木', '1.0', '8.5', '晴れ', '曇り'], ['金', '1.5', '10.0', '曇り', '晴れ']], index = ['2025-04-03', '2025-04-04'], columns = ['【week】', '【℃-min】', '【℃-max】', '【Today】', '【Tomorrow】'])

で、これと同じ結果になるのが下のプログラムです。

df_dd2_data = [['木', '1.0', '8.5', '晴れ', '曇り'], ['金', '1.5', '10.0', '曇り', '晴れ']]
df_dd2_index = ['2025-04-03', '2025-04-04']
df_dd2_col = ['【week】', '【℃-min】', '【℃-max】', '【Today】', '【Tomorrow】']

df_add_data_2 = pd.DataFrame(df_dd2_data, index = df_dd2_index, columns = df_dd2_col)

.DataFrame のそれぞれの項目に入るようなデータの変数を用意して、 .DataFrame の ( ) 内の項目は変数を使用しています。

df_add_data_1とdf_add_data_2を用意したのは、[ ] の使い方を確認する為です。追加するデータが1行だけの場合、[ [0行目のデータ] ] と [ ] が2重になります。[ [0行目のデータ ], [1行目のデータ ] ] となっています。1行追加と2行追加のプログラムを見比べると、分かりやすいとおもいます。

メソッド一覧へ

データの連結

.concat で元のデータと連結

結果3-5(シェル)

df_add_linedata = pd.concat([df, df_add_data_2])

元々のデータ(df)と追加したいデータ(df_add_data_2)が連結できているのが分かります。

メソッド一覧へ

データをcsvファイルに保存

.to_csv(‘ファイル名’, index_label=’インデックス名’, sep=’,’) で簡単に保存できます。ファイルが既にある場合は上書き保存を、存在しない場合はファイルを新規作成してデータを保存します。

import pandas as pd

df = pd.read_csv('./weather-2025.txt', index_col='【date】', sep=',')
a = df.head(2)
print(a, '\n')

df_dd2_data = [['木', '1.0', '8.5', '晴れ', '曇り'], ['金', '1.5', '10.0', '曇り', '晴れ']]
df_dd2_index = ['2025-04-03', '2025-04-04']
df_dd2_col = ['【week】', '【℃-min】', '【℃-max】', '【Today】', '【Tomorrow】']
df_add_data_2 = pd.DataFrame(df_dd2_data, index = df_dd2_index, columns = df_dd2_col)
print('「df_add_data_2」\n', df_add_data_2, '\n')

df_add_linedata = pd.concat([df, df_add_data_2])
print('「New_data」\n',df_add_linedata, '\n')

df_add_linedata.to_csv('./weather-2025-3.txt', index_label='【date】', sep=',')

df と df_add_data_2 のデータをドッキングしたのが df_add_linedata で、これを存在しないファイル名「weather-2025-3.txt」に保存しました。

メソッド一覧へ

外部ライブラリ pandas の基本的な機能の一部を学ぶことができたと思います。

コメント

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