Pandasを使ったCSVの読み書きとvalidation

Nov 26, 2023 14:45 · 1566 words · 4 minute read python

とあるツールのコードを見ていたら、Pandasを使ってCSVデータの読み書きをしていました。 これまでPyhonでCSVファイルを読み書きするときは標準の組み込みモジュールを使っていましたが、Pandasを使うのも便利そうです。

Pandasを使ったCSVファイルの読み書きとValidationについて検証したので、今後のために検証結果をブログにアウトプットしておきます。

目次

Pandasとは

Pandasは、データ操作をするためのPythonのライブラリです。 以前参加した勉強会では、講師の方が「誤解を恐れずに言うと、PythonでExcel操作をするイメージです」と説明していました。

「CatBoostと特徴エンジニアリングでテーブルデータ解析AIハンズオン」に参加した · kapieciiのブログ

CSVやExcelのデータを読み書きするだけでなく、欠落データや重複データの処理、データの集計もできます。

Pandasを使ったCSVファイルの読み書き

Pandasを使ってCSVファイルを読み書きするサンプルコードです。 組み込みCSVモジュールと違い、行単位だけではなく列単位の操作もできる点がまさに「PythonでExcel操作をするイメージ」ですね。

CSVファイルはIBMさんが公開しているサンプル用のCSVデータを使いました。

サンプル CSV ファイル - IBM Documentation

import pandas as pd


# read the csv file
csv_file = './SupplyPlan_v1.csv'
df = pd.read_csv(csv_file)
print(df.head())
print(df.columns)
print(df['product.partNumber'])

products = df['product.partNumber'].unique()
print(type(products)) # numpy.ndarray class

# loop sample
for product in products:
    print(product)

# write a single columun csv file
output_test_array = ['test1', 'test2', 'test3']
output_df = pd.DataFrame(output_test_array, columns=['test-number'])
output_df.to_csv('output.csv', index=False)

# write a multiple columun csv file
output_test_array2 = [['test1', 'test2', 'test3'], ['test4', 'test5', 'test6']]
output_df = pd.DataFrame(output_test_array2, columns=['test-number', 'test-number2', 'test-number3'])
output_df.to_csv('output2.csv', index=False)

# write dict data to csv file
output_test_dict = {'test-number': ['test1', 'test2', 'test3'], 'test-number2': ['test4', 'test5', 'test6']}
output_df = pd.DataFrame(output_test_dict, columns=['test-number', 'test-number2', 'test-number3'])
output_df.to_csv('output3.csv', index=False)

# write dict list data to csv file
output_test_array = [{'a': 'test1', 'b': 'test2', 'c': 'test3'}, {'a': 'test4', 'b': 'test5', 'c': 'test6'}]
output_df = pd.DataFrame(output_test_array)
output_df.to_csv('output4.csv', index=False)

Pydanticを使ったデータのValidation

先日Pydanticを使ったデータのValidationを試したばかりなので、Pandasで読み込んだデータのValidationも試しました。

pydanticを使ってpythonで型のチェックをする · kapieciiのブログ

先に結論

既存のPydanticのmodelデータを活かしたい場合は、Pydanticを使うのもアリ。 しかし、既存資産が無い場合はdataframeの状態で検証できるPanderaを使う方が良さそうです。

Pydanticを使う場合、一度CSVデータをdataframeに読み込み、dataframeに読み込んだデータを操作するタイミングで値の検証をします。 対してPanderaを使う場合は、CSVファイルをdataframeに読み込んだ後、直接dataframeの検証が可能です。
多くの場合、CSVファイルを読み込み、Panderaでデータを検証した後、データを操作する流れになるでしょう。

参考URL

サンプルコード

あまり使う機会はないかもしれないですが、参考用にPydanticを使った場合のサンプルコードを残しておきます。

import pandas as pd
from pydantic import BaseModel


class Product(BaseModel):
    id: int
    partNumber: str
    url: str


csv_file = './SupplyPlan_v1.csv'
df = pd.read_csv(csv_file, index_col=None)
output_list = []
id = 0

# create a list for output.csv
for row in df.itertuples(index=False):
    item = {
        'id': id,
        'partNumber': row[0],
        'url': row[10]
    }
    output_list.append(Product(**item).dict())
    id += 1

output_df = pd.DataFrame(output_list)
output_df.to_csv('output_pydantic.csv', index=False)

Panderaを使う場合のサンプルコードは、下記のリンク先をご覧ください。 PanderaはPydanticに影響を受けているので、デコレータを使ったチェック関数も使えます。

最後に

Pandasを使ったCSVファイルの読み書きと、CSVデータの検証について学びました。

標準の組み込みモジュールを使うよりもPandasを使う方が便利そうだったので、次回からはPandasも選択肢に入れようと思います。

tweet Share