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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

1622閲覧

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

Danrussia

総合スコア44

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/04/18 11:23

編集2019/04/18 14:16

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

LabelSumpleBeanNumber
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 ... )下記のようなデータセットのイメージです。

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

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

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

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

Python

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

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

Python

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

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

Python

1import os 2import pandas as pd 3os.chdir("C:\Users\For Programming\Documents\Python Scripts") 4df1 = pd.read_csv('Native Been Analyze Side ver2 Re.csv', encoding="shift-jis") 5for Label in set(df1["Label"]): 6 df1[df1["Label"]==Label].to_csv(Label.replace(".jpg", "New"))

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

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

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

python3

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

投稿2019/04/18 14:27

gyungyun545

総合スコア84

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Danrussia

2019/04/18 14:37

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

2019/04/19 01: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だけを取り出して、新規ファイルを作る処理としか捉えられなかったです。 お時間がある時で大丈夫ですので、教えて頂ければ幸いです。
gyungyun545

2019/04/19 02:49 編集

まず、「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]のように同じレコードに対して同じ処理を繰り返し実行し非効率です。(結果としては同じファイル名に繰り返し上書きするので変わらないです。)
Danrussia

2019/04/19 02:55

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

0

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

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

python3

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

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

投稿2019/04/18 12:13

gyungyun545

総合スコア84

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Danrussia

2019/04/18 13:09

すいません「纏める」の部分を明確化しました。 各LabelごとにBeanNumber,Sumpleの列も含めて、それらをcsvファイルにして作成するという意味です。 もう一度質問の部分を明確に書き直したので、見ていただければ幸いです。
gyungyun545

2019/04/18 13:17

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

2019/04/18 14:18

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問