Pandasを使ったCSVの読み書きとvalidation
Nov 26, 2023 14:45 · 1566 words · 4 minute read
とあるツールのコードを見ていたら、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
- unionai-oss/pandera: A light-weight, flexible, and expressive statistical data testing library (github.com)
- DataFrame を Validation する pandera 入門 (zenn.dev)
サンプルコード
あまり使う機会はないかもしれないですが、参考用に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に影響を受けているので、デコレータを使ったチェック関数も使えます。
- unionai-oss/pandera: A light-weight, flexible, and expressive statistical data testing library (github.com)
- DataFrame を Validation する pandera 入門 (zenn.dev)
最後に
Pandasを使ったCSVファイルの読み書きと、CSVデータの検証について学びました。
標準の組み込みモジュールを使うよりもPandasを使う方が便利そうだったので、次回からはPandasも選択肢に入れようと思います。