質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.59%

PythonにおけるひとつのCSVファイルの分割方法

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 534

Danrussia

score 42

Pythonを使用して一つのCSVファイルを複数のCSVファイルに分割したいです。
(データセット下記)

Label Sumple BeanNumber
img061c.jpg くるみ豆 B2
img061c.jpg くるみ豆 B2
img061c.jpg くるみ豆 B2
...
img065c.jpg 五葉黒豆 B6
img065c.jpg 五葉黒豆 B6
...
img093c.jpg 濃緑丸豆 B39
img093c.jpg 濃緑丸豆 B39
img093c.jpg 濃緑丸豆 B39
img093c.jpg 濃緑丸豆 B39
img093c.jpg 濃緑丸豆 B39

このデータセットの各Label名ごとにデータを纏めて(Sumple,BeanNumbeを含めて)
各LabelごとにCSVファイルの作成を行いたいです。
Labelごと(img061c,img062c,img063c ... )下記のようなデータセットのイメージです。

Label Sumple BeanNumber
img061c.jpg くるみ豆 B2
img061c.jpg くるみ豆 B2
img061c.jpg くるみ豆 B2
...
img061c.jpg くるみ豆 B2
Label Sumple BeanNumber
img065c.jpg 五葉黒豆 B6
img065c.jpg 五葉黒豆 B6
img065c.jpg 五葉黒豆 B6
...
img065c.jpg 五葉黒豆 B6
Label Sumple BeanNumber
img093c.jpg 濃緑丸豆 B39
img093c.jpg 濃緑丸豆 B39
img093c.jpg 濃緑丸豆 B39
...
img093c.jpg 濃緑丸豆 B39

label名ごとにデータをまとめてCSVファイルを作成する際には、そのファイル名はLabel名から".jpg"を削除し、新たに"New"を付けくわえ"img061cNew"というような形にCSVファイル名にしたいです。

コードをgyungyun545さんに修正して貰い、一応希望通りに動作させる事ができました。
しかしながら下記の写真のように拡張子のないファイルが生成されてしまいました。
実際に生成されたファイル

また実際にこのファイルをCSV形式で開いてみたところ、文字化けしていました。
またこれに関してはencodingを"utf-16"にした場合はエラーコードがこのような形になり、

'utf-16-le' codec can't decode bytes in position 42-43: illegal encoding


encodingを"utf-8"にした場合でもエラーでした。

'utf-8' codec can't decode byte 0x82 in position 0: invalid start byte


(これに関しては手作業でも一応修正できるのですが、生成されたファイルが100近くあり、可能であれば自動で修正したいです...)
エラー説明

import os
import pandas as pd
os.chdir("C:\\Users\\For  Programming\\Documents\\Python Scripts")
df1 = pd.read_csv('Native Been Analyze Side ver2 Re.csv', encoding="shift-jis")
for Label in set(df1["Label"]):
   df1[df1["Label"]==Label].to_csv(Label.replace(".jpg", "New"))
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

>コードをgyungyun545さんに修正して貰い、一応希望通りに動作させる事ができました。
>しかしながら下記の写真のように拡張子のないファイルが生成されてしまいました。
⇒ 要件通り忠実に実装したつもりですが、拡張子「.jpg」が必要だったようですね。
(Linuxで実装していると拡張子がなくても気にならないので・・・)
これは、to_csvのファイル名のところ、最後に「+".jpg"」を入れることで解決すると思います。

また、2つの目の文字コードの問題ですが、これもto_csvのオプションでencoding='shift_jis'でshift_jisで出力してやれば解決すると思います。

for Label in set(df1["Label"]):
   df1[df1["Label"]==label].to_csv(label.replace(".jpg", "New") + ".jpg", index=false, encoding='shift_jis')

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/04/18 23:37

    解決する事ができました。自分の要望が混乱を招く形になってしまい申し訳ありません。

    キャンセル

  • 2019/04/19 10:23

    昨夜はご教授ありがとうございました。
    このコードの意味について一点分らなかった事があったので質問させてください。

    for Label in list(df1["Label"]):
    df1[df1["Label"]==Label].to_csv(Label.replace(".jpg", "New") + ".csv", index=False, encoding='shift_jis')

    この文の1行目、for~in(df1["Label"]):
    はdf1のデータセットからラベルを参照する

    2行目の
    df1[df1["Label"]==Label]..to_csv(Label.replace(".jpg", "New") + ".csv", index=False, encoding='shift_jis')
    df1のラベルとFor文で抽出したラベルが一致すれば、ラベルを変える。というようなコードだと解釈したのですが、この一連のコードで、SumpleとBeanNumbeはどういった仕組みでLabelと一緒にもってきているのでしょうか...
    自分の理解度では、Labelだけを取り出して、新規ファイルを作る処理としか捉えられなかったです。

    お時間がある時で大丈夫ですので、教えて頂ければ幸いです。

    キャンセル

  • 2019/04/19 11:48 編集

    まず、「df1[df1["Label"]==Label]」は、Label列の内容が変数Labelと一致するレコードを抽出という意味です。Excelのフィルターと同じようなイメージで、該当するレコードを行ごと抜き出してくるので、SumpleとBeanNumbeも含まれます。
    もし、Label列だけ抜き出したいなら、「df1[df1["Label"]==Label]["Label"]」のような形で指定することができます。

    あと、質問と離れますが「for Label in list(df1["Label"]):」の部分は私のコードと少し違います。
    listではなくsetとしたのは同じ値のものを1回だけ実行したいからです。
    listにした場合は[img061c.jpg,img061c.jpg,img061c.jpg,...,img093c.jpg,img093c.jpg]のように同じレコードに対して同じ処理を繰り返し実行し非効率です。(結果としては同じファイル名に繰り返し上書きするので変わらないです。)

    キャンセル

  • 2019/04/19 11:55

    理解できました。丁寧な質問ありがとうございました。
    set型にあまりなじみがないのと、set型を採用した意味が(昨晩の時点では)理解できなかったので、list型にこちらから勝手に変更しました。その点の説明もありがとうございます。

    キャンセル

+1

「纏めて」と言う部分が何をしたいのか明確でないのですが、単に分けるだけなのでしょうか?それとも行数を集計、出すのでしょうか?
全く同じ行を1行だけ残せばよいのでしょうか?

もし、単に分けるだけなら下記の形で実装可能です。

for label in set(df1["Label"]):
   df1[df1["Label"]==label].to_csv(label.replace(".jpg", "New"))


ループでLabelのデータを取り出して、それでpandasをフィルターします。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/04/18 22:09

    すいません「纏める」の部分を明確化しました。

    各LabelごとにBeanNumber,Sumpleの列も含めて、それらをcsvファイルにして作成するという意味です。

    もう一度質問の部分を明確に書き直したので、見ていただければ幸いです。

    キャンセル

  • 2019/04/18 22:17

    それであれば上記に提示したプログラムで問題ないです。
    ただ、to_csvはindexが自動で作られるので、不要の場合は、index=falseを引数に入れてください。

    キャンセル

  • 2019/04/18 23:18

    一応ファイルは生成されたのですが、すべてのファイルでファイル形式が不明なのとCSV形式で無理やり開いてみた所文字化けを起こしていました。
    もう一度現状を書き直したものを再編集しておきました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.59%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る