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

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

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

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

Python

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

Q&A

3回答

303閲覧

ある列のデータが重複しているとき、違う列のデータをコンマで繋ぐ際の考え方

chibi144

総合スコア64

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

Python

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

0グッド

1クリップ

投稿2018/07/02 08:42

編集2018/07/03 02:01

前提・実現したいこと

現在以下のように入力されているcsv(元はExcel)があります。

大分類品目
野菜ニンジン
野菜にがうり
野菜ピーマン
果物りんご
果物みかん
チューリップ

これを、下のようなデータに書き換えたいと思っています。

大分類品目
野菜ニンジン,にがうり,ピーマン
果物りんご,みかん
チューリップ,桜

csvの編集といえばVBAかPythonなのかなと思い
せっかくだからとPythonの文法を調べている段階です。

発生している問題・エラーメッセージ

以下のようなフローを考えました。(用語の不正確さはご容赦ください)

  1. 元となる配列(今回はcsv)を準備する
  2. 元となる配列をforで回す
  3. 何らかの変数を準備して、初出の大分類をキーにした空配列を作る
  4. 既出の大分類が出現したら品目の要素を↑の配列に入れてから削除する
  5. もう一度forを回して、↑の情報を上書きしていく

もっとすっきり書けないものかと思うのですが、どうにも良い方法が思いつきません。
今回の場合、どのような考え方で処理を行っていくのが正解でしょうか。

該当のソースコード

考え方の時点で?となったので、コードはcsvをprintするところで止まっています。

python

1import pandas as pd 2 3df = pd.read_csv('test.csv').values.tolist() 4 5for key,value in enumerate(df): 6 print("{0} = {1[0]}".format(key,value))

補足情報(FW/ツールのバージョンなど)

Python:3.6

追記

ひとまず書けるところまで書いてみました。(当初の考え方とは変わってしまいましたが…)
思っているような結果が出ることは確認済みです。
メソッドの書き方がこれで本当に正しいのかは自信がありません。

python

1class Sample: 2 3 def __init__(self, readCsvFile, writeCsvFile): 4 self.readCsvFile = readCsvFile 5 self.writeCsvFile = writeCsvFile 6 7 def read(self): 8 import pandas as pd 9 return pd.read_csv(self.readCsvFile).values.tolist() 10 11 def edit(self, df): 12 from itertools import groupby 13 14 # 大分類初出リスト 15 firstAppearanceList = [] 16 # 項目リスト 17 itemsList = [] 18 19 for key, group in groupby(df, key=lambda x: x[0]): 20 # 大分類をまたいだ項目の重複は可とする(野菜のスイカと果物のスイカは別扱い) 21 seen = [] 22 firstAppearanceList.append(key) 23 itemsList.append(','.join([x[1] for x in list(group) if x[1] not in seen and not seen.append(x[1])])) 24 25 return list(zip(firstAppearanceList, itemsList)) 26 27 def write(self, list): 28 import csv 29 f = open(self.writeCsvFile, 'w') 30 writer = csv.writer(f, lineterminator='\n') 31 writer.writerows([x for x in list]) 32 33def done(readCsvFile, writeCsvFile): 34 sample = Sample(readCsvFile, writeCsvFile) 35 df = sample.read() 36 list = sample.edit(df) 37 sample.write(list) 38 39print('インポート(加工)したいcsvのファイル名を入力してください。') 40readCsvFile = input('>> ') or 'test.csv' 41print('エクスポートする際のcsvのファイル名を入力してください。') 42writeCsvFile = input('>> ') or 'tmp.csv' 43done(readCsvFile, writeCsvFile)

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

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

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

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

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

mather

2018/07/02 08:46

「もっとすっきり書けないものかと思うのですが、どうにも良い方法が思いつきません。」とありますが、最初は愚直でもいいので自分の力で動くものを書いてください。アドバイスを受けるのはそれからです。
chibi144

2018/07/02 08:50

ご依頼ありがとうございます。ひとまず上の考え方で書けるところまで書いてみて(書ききれるかも怪しいですが)、その分を追記します。
chibi144

2018/07/03 02:03

追記しました。今までに頂いているご回答はまだ全く見れていないので、これからじっくり読ませていただきます。
guest

回答3

0

Python

1import pandas as pd 2 3df = pd.read_csv('test.csv', encoding='Shift_JIS') # エクセルで作成したcsvファイルを読み込み 4df['品目'] = df['品目']+',' # sum()適用時にカンマ入れれないためここで入れる 5grouped = df.groupby(['大分類']) 6df2 = grouped.sum() 7for i in range(len(df2.index)): # 末尾の不要なカンマを取り除く 8 df2['品目'][i] = df2['品目'][i][:-1] 9print(df2) # Jupyterならdf2のみで打ち出すと見やすいです

やや強引ですが、こんな感じでどうでしょうか?

投稿2018/07/02 10:03

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

こういう事でしょうか?

Python

1import pandas as pd 2import io 3 4data = """ 5大分類,品目 6野菜,ニンジン 7野菜,にがうり 8野菜,ピーマン 9果物,りんご 10果物,みかん 11花,チューリップ 12花,桜""" 13 14df = pd.read_csv(io.StringIO(data)) 15df = df.groupby('大分類')['品目'].apply(list) 16print(df) 17#大分類 18#果物 [りんご, みかん] 19#花 [チューリップ, 桜] 20#野菜 [ニンジン, にがうり, ピーマン] 21#Name: 品目, dtype: object

投稿2018/07/02 09:58

magichan

総合スコア15898

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

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

0

行によって列数が違うcsvにするということでしたら、pandasはあまり向いていない気がします。
csvモジュールを使って愚直に書いてみました。

python

1import io 2import csv 3from collections import defaultdict 4 5data = """大分類,品目 6野菜,ニンジン 7野菜,にがうり 8野菜,ピーマン 9果物,りんご 10果物,みかん 11花,チューリップ 12花,桜""" 13 14# データを読み込んでdefaultdictに入れる 15input_f = io.StringIO(data) # io.StringIOの代わりに入力のファイルオブジェクトを置けます 16reader = csv.reader(input_f) 17 18header = next(reader) 19d = defaultdict(list) 20for cls, item in reader: 21 d[cls].append(item) 22input_f.close() 23 24 25# csvに書き出す 26output_f = io.StringIO() # io.StringIOの代わりに出力のファイルオブジェクトを置けます 27writer = csv.writer(output_f) 28writer.writerow(header) 29for cls, items in d.items(): 30 writer.writerow([cls, *items]) 31print(out.getvalue()) # io.StringIOの中身を確認するためのコードで、実際は不要です 32out.close() 33 34""" => 35大分類,品目 36果物,りんご,みかん 37野菜,ニンジン,にがうり,ピーマン 38花,チューリップ,桜 39"""

投稿2018/07/02 18:43

hayataka2049

総合スコア30933

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問