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

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

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

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

Python

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

3回答

2285閲覧

csvファイルの全組み合わせを違うセルに代入したい

lmk

総合スコア16

Python 3.x

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

Python

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2019/05/31 08:32

前提・実現したいこと

つい最近pythonを扱い始めた初心者です。

pythonを用いてデータ処理を行っております。

3つのcsvファイルの直積を得たく、以前はitertools.productより求めていましたが、
・数値は和になってしまうこと
・数値を文字列としても1つのセルにすべての数字が入ってしまうこと
から、for文で何とかできないかと考えております。

①1,2,3 ②4,5,6 ③7,8,9
の3つのデータだとしたら、
(1,4,7),(1,4,8),(1,4,9),(1,5,7)…という組み合わせになりますが、
itertools.productですと1つのセルに147と表示されてしまうため、1,4,7をそれぞれ同じ行の違う列のセルに入れたいと考えています。

全組み合わせが別のセルに入れることが可能であれば、csvファイルでもxlsxファイルでも構いません。

初歩的な質問で申し訳ございません。ご教授願います。

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

エラーメッセージは表示されませんが、csvファイルを開くと、縦に atime 1 2 3 btime 4 5 6 ctime 7 8 9 ctime 7 8 9 のように表示されてしまいます。 --------------------------------------- xlsxファイルでも試みてみた際に発生したメッセージです ws.cell(row=i,column=3) = a.cell(row=i,column=2) ^ SyntaxError: can't assign to function call

該当のソースコード

python

1import pandas as pd 2import csv 3 4a = pd.read_csv('a.csv') 5b = pd.read_csv('b.csv') 6c = pd.read_csv('c.csv') 7 8for atime in a['time']: 9 a['time'].to_csv('time.csv', columns=['time'], header=['atime'], index=True) 10 for btime in b['time']: 11 b['time'].to_csv('time.csv', columns=['time'], mode='a', header=['btime'], index=True) 12 for ctime in c['time']: 13 c['time'].to_csv('time.csv', columns=['time'], mode='a', header=['ctime'], index=True) 14 15---------------------------------------------------- 16xlsxファイルで試したソースコードです 17 18import pandas as pd 19import csv 20import openpyxl as px 21 22a = px.load_workbook('a.xlsx') 23b = px.load_workbook('b.xlsx') 24c = px.load_workbook('c.xlsx') 25wb = openpyxl.Workbook() 26ws = wb.active 27 28for i in range(2,cpurow+1): 29 ws.cell(row=i,column=3) = a.cell(row=i,column=2) 30 for j in range(2,mbrow+1): 31 ws.cell(row=j,column=4) = b.cell(row=j,column=3) 32 for k in range(2,memoryrow+1): 33 ws.cell(row=k,column=5) = c.cell(row=k,column=4) 34 35wb.save('time.xlsx')

試したこと

横につなげたいためconcat等も用いましたが、うまくいきません…

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

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

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

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

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

guest

回答3

0

セルを分けるだけなら

python

1import itertools 2import csv 3 4a, b, c = [1, 2, 3], [4, 5, 6], [7, 8, 9] 5 6with open('result.csv', 'w') as fw: 7 8 writer = csv.writer(fw, dialect='excel', lineterminator='\n') 9 10 # ヘッダー 11 writer.writerow([ 12 "atime", 13 "btime", 14 "ctime", 15 ]) 16 17 # データ 18 for i in itertools.product(a, b, c): 19 # print(i) 20 21 writer.writerow(i)

投稿2019/06/01 08:10

barobaro

総合スコア1286

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

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

lmk

2019/06/02 13:43

回答ありがとうございます。 for文でこんな簡単にできることに驚きました。 withの使用に不慣れなため、自分なりに学習を進めていきたいと思います。 有益なアドバイスをありがとうございました。大変勉強になりました。
guest

0

1,4,7をそれぞれ同じ行の違う列のセルに入れたいと考えています。

pandasでも以下のようにすればできます。

Python

1import itertools 2import pandas as pd 3 4df = pd.DataFrame(columns=['a','b','c']) 5 6a,b,c = [1,2,3], [4,5,6], [7,8,9] 7for aa,bb,cc in itertools.product(a,b,c): 8 dfp = pd.DataFrame({'a':[aa], 'b':[bb], 'c':[cc]}) 9 df = pd.concat([df, dfp], axis=0) 10 11print(df.reset_index(drop=True)) 12""" 13 a b c 140 1 4 7 151 1 4 8 162 1 4 9 173 1 5 7 18: 19"""

投稿2019/06/01 07:01

can110

総合スコア38262

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

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

lmk

2019/06/02 13:47

回答ありがとうございます。 for文の中にDataframeを入れることでうまくいくのですね…! print結果まで提示していただき、ありがとうございます。 詳細について自分なりに学習を進めていきたいと思います。 丁寧な回答ありがとうございました。大変勉強になりました。
guest

0

ベストアンサー

for文で書くのだったら、次のように書くのが素直です。

python

1with open('time.csv', 'w') as f: 2 for at in a['time']: 3 for bt in b['time']: 4 for ct in c['time']: 5 f.write(f'{at},{bt},{ct}\n')

Pandasだけで完結したいのであれば、join又はmergeを使う方法があります。

python

1import numpy as np 2 3df = a.set_index([np.ones(len(a), dtype='int')])\ 4 .join(b.set_index([np.ones(len(b), dtype='int')]), rsuffix='_b')\ 5 .join(c.set_index([np.ones(len(b), dtype='int')]), lsuffix='_a', rsuffix='_c')\ 6 .reset_index(drop=True) 7df.to_csv('time.csv')

itertoolsを使うのであれば次のように直接DataFrameに変換した方がずっと速いです。でも、joinを使う方が速いです。

python

1import itertools 2 3df2 = pd.DataFrame(itertools.product(a['time'], b['time'], c['time']), 4 columns=['atime', 'btime', 'ctime']) 5df2.to_csv('time.csv')

投稿2019/06/01 03:31

編集2019/06/01 08:48
YasuhiroNiji

総合スコア584

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

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

lmk

2019/06/02 13:40

回答ありがとうございます。 何パターンも提示していただきありがたい限りです。今回Dataframeを利用したのと、joinやmergeについて分かったこと、withについてもわかりやすく書いていただいたことからベストアンサーにさせていただきます。 Dataframeに変換するのが早く、他に組み込んでいるシステムとの繋がりも良かったので使わせていただきました。 また、Dataframeの変換に関して、自分ではどうしても数値が総和になってしまったのですが、別々のセルに入れることができたのは何故でしょうか?大変恐縮ではございますがご教授いただければ幸いです。
YasuhiroNiji

2019/06/03 02:49

itertools.product は tuple を返します。和になってしまうというのは、sum 等何らかの演算をしていたのではないでしょうか。
lmk

2019/06/12 06:39

返信遅れてしまい大変申し訳ありません。 確認したところ、変数同士が足されておりました。。。。 不勉強で恐縮です。 迅速な対応ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問