@mizushino (みずしの)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

【Python_pandas】単体CSVファイルのDataFrame作成する場合、pandas.concatは必要か否か

Pythonのpandasモジュールについて質問です。
初心者の質問ですみません。。

解決したいこと

ワイルドカードのcsvファイルパスを検索して、DataFrame作成がしたいです。

検索されたファイルが複数の場合、
ワイルドカード(sample-*.csv)検索引っかかったファイルをcsv_sampleリストへ追加、
concatで複数のDataFrameを連結する流れだと思いますが、
ファイル検索結果が単体(1つ)のファイルの場合、複数ファイルを連結する必要が無いので、④のスクリプトは不要でしょうか?
しかし、③で終わると変数の型(データ型)がlistのままで、④までやるとDataFrameにしてくれるので、
そういう意味では④までスクリプトは必須でしょうか?

ご教示いただけますととても助かります。

▼Pythonスクリプト手順

①カレントディレクトリとワイルドカード結合

path_sample_join = str(current_dir / 'sample-*.csv')

②ワイルドカードパターン一致するファイル検索

matching_files_sample = glob.glob(path_sample_join)

③pandasで複数ファイルを読み込みDataFrameを作成、csv_sampleリストへ追加

csv_sample = [pandas.read_csv(file) for file in matching_files_sample]

④concatで複数のDataFrameを連結する

df_sample = pandas.concat(csv_sample, ignore_index=True)

▼補足

・③で終わった場合の変数の型(データ型)

print(type(csv_sample))
⇒<class 'list'>

・④まで実施した場合の変数の型(データ型)

print(type(df_sample))
<class 'pandas.core.frame.DataFrame'>
0 likes

3Answer

ファイルが1つの場合でも4までやるのがいいと思います。

そうでない場合は、4のタイミングで・ファイルが2つ以上あればconcat実施 ・ファイルが1つであれば0番目を取り出す というような判断と処理が必要になり、処理が煩雑になります。concat処理のコストが高いというような積極的な理由があるのであれば、そのような分岐を入れるのに意味がありますが、実際はそれほどコストはかかりません。

1Like

こんにちは、コメント失礼します。

この場合、ファイルが単体(1つ)の場合に関しては、④のステップ(concatによる連結)は不要ですが、③の時点では csv_sample がリスト型であるため、連結処理を行わない場合でもリストを DataFrame に変換するために④のステップが必要になると思います。

もし検索結果が1つのファイルだけの場合、③でリストとしてファイルを読み込むだけですので、その時点で変数がリスト型のままになります。このリストをそのまま処理したい場合は問題ありませんが、pandas の DataFrame として扱いたい場合は、リストを単体の DataFrame に変換する処理が必要です。

解決方法としては
1つのファイルの場合:もし検索結果が1つのファイルだけなら、リストを使う代わりにそのファイルを直接読み込んで DataFrame を作成すれば良いのではないでしょうか。

python
if len(matching_files_sample) == 1:
df_sample = pandas.read_csv(matching_files_sample[0])
else:
csv_sample = [pandas.read_csv(file) for file in matching_files_sample]
df_sample = pandas.concat(csv_sample, ignore_index=True)

検索結果が1つのファイルの場合は concat を使う必要はなく、直接 read_csv で DataFrame を作成できます。もしファイルが複数あれば、concat を使って DataFrame を結合するという形になります。csv_sample がリスト型のままだと DataFrame に変換できないため、その場合は concat を使うか、単一ファイルの場合は直接読み込んで DataFrame として扱うことをおすすめします。

私も初心者なのであってるかわかりませんが...

1Like

ファイル検索結果が単体(1つ)のファイルの場合

それはどの段階で分かるのでしょうか?
ファイル検索結果が1つかどうかを調べるのと、pandas.concatを実行するのどちらがコストがかかるのかで決めれば良いかと。

私なら何にも考えずにpandas.concatのコードにすると思います。シンプルなコードの方が良いと思うからです。

1Like

Your answer might help someone💌