2017-08-22 4 views
0

ディレクトリ内の.jpgファイルを繰り返し処理して、aの単一列(image_name)の名前と一致させようとしています。 .csvファイル。ディレクトリ内のファイル名と、pythonの.csvファイル内の要素をpandasを使って照合しようとしています

エラーメッセージが表示されます。ValueError:Seriesの真理値が曖昧です。 a.empty、a.bool()、a.item()、a.any()またはa.all()を使用します。 コードを教えてもらえますか?

答えて

0

行番号は含めませんが、エラーは行番号imagenames.iloc[i] == filenameにあると仮定します。 imagenames.iloc[i]がPandasシリーズオブジェクト(単一の列を表す)になるため、このエラーが発生しています。

imagenames.iloc[i]['image_name']と置き換えて解決できますが、結果コードには2つのループがあり、多大な作業が必要になります。

代わりに、私は次の目的でリファクタリングお勧めします:

  • あなたはあなたが欲しい
  • をディレクトリ一覧からファイル名のリストを持っているCSV
  • からファイル名のリストを持っていますこれらの2つのリストの交差点(つまり、両方に表示されるファイル名)

これを行うにはいくつかの方法がありますが、これらのリストの大きさについては言及していません。のは、彼らは次のようになり、データへのパンダベクトル化のアプローチに沿って、より多くのコードに近づくために、比較的小さな、一つの方法だと仮定しましょう:

imagenames=pd.read_csv('file.csv',header=0,usecols=['image_name']) 
files_in_dir = os.listdir("directory") 
matches = imagenames[imagenames['image_name'].isin(files_in_dir)] 

.isinは、ファイルのリストを検索されるように、これは超効率的ではありませんリストがかなり長い場合、潜在的に遅くなる可能性があります。あなたの状況に該当する場合は、セットまたは他の最適化の使用を検討することができます。

+0

を!問題を解決しました。 –

0

私はそれをこのようにしてください:素晴らしいザッツ

import os 
import glob 
import pandas as pd 

mask = r'/path/to/*.jpg' 
jpgs = [os.path.split(f)[1] for f in glob.glob(mask)] 
imagenames = pd.read_csv('file.csv',usecols=['image_name'],squeeze=True) 

print(imagenames[imagenames.isin(jpgs)]) 
関連する問題