質問: {'タイトル', '作者'} # エラーメッセージはここがおかしいと言っています。 df.drop_duplicates(subset="タイトル", keep="first") # タイトル重複を削除 df.to_csv('./Data/books.csv', mode='w', encoding='utf_8_sig') # 上書き ``` ### エラー ``` ValueError: Length mismatch: Expected axis has 3 elements, new values have 2 elements ``` ### 得られたデータ ,作者,タイトル 0,あああ,太郎 1,いいい,花子 2,ううう,雄太 ### 環境 Python3.7.4 pandas0.25.1 ご教授お願いします。
回答: **1. エラーが出る原因** CSVデータの読み込み部 ``` csv_file = pd.read_csv('./Data/books.csv', encoding="utf_8_sig") ``` にて読み込まれたDataFrame(`csv_file`)では、本来は **"Index"** として扱われるべき1列目が **"データ"** として扱われてしまいます。 その結果 作成される DataFrame(`df`) も `[0(元Indexデータ), "タイトル", "作者"]` の3列のデータとなってしまいます。 にも関わらず ``` df.columns = {'タイトル', '作者'} ``` の部分にて2列分のColumn名を与えている為 "ValueError"(データは3列あるのに列名は2つしか与えられてないぞゴラー:意訳) が発生しております 対策としては、 ``` csv_file = pd.read_csv('./Data/books.csv', encoding="utf_8_sig", index_col=0) ``` のように1列目をIndex列であると明示することで2列のデータとしてよみこまれるかと思います。 **2. 順番がおかしくなる原因** 1. と同様にColumn名を与えている ``` df.columns = {'タイトル', '作者'} ``` の部分にて、Column名`{'列1の名前', '列2の名前'}`を set型で与えておりますが、set型は順番情報を持たない型となりますので、どの列にどの名前が適用されるかの保証がありません。 ここは素直に順番情報を持つList型で ``` df.columns = ['タイトル', '作者'] ``` とするべきかと思います。