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

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

ただいまの
回答率

88.77%

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

解決済

回答 3

投稿

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

lmk

score 13

前提・実現したいこと

つい最近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

該当のソースコード

import pandas as pd
import csv

a = pd.read_csv('a.csv')
b = pd.read_csv('b.csv')
c = pd.read_csv('c.csv')

for atime in a['time']:
    a['time'].to_csv('time.csv', columns=['time'], header=['atime'], index=True)
    for btime in b['time']:
        b['time'].to_csv('time.csv', columns=['time'], mode='a', header=['btime'], index=True)
        for ctime in c['time']:
            c['time'].to_csv('time.csv', columns=['time'], mode='a', header=['ctime'], index=True)

----------------------------------------------------
xlsxファイルで試したソースコードです

import pandas as pd
import csv
import openpyxl as px

a = px.load_workbook('a.xlsx')
b = px.load_workbook('b.xlsx')
c = px.load_workbook('c.xlsx')
wb = openpyxl.Workbook()
ws = wb.active

for i in range(2,cpurow+1):
    ws.cell(row=i,column=3) = a.cell(row=i,column=2)
    for j in range(2,mbrow+1):
        ws.cell(row=j,column=4) = b.cell(row=j,column=3)
        for k in range(2,memoryrow+1):
            ws.cell(row=k,column=5) = c.cell(row=k,column=4)

wb.save('time.xlsx')

試したこと

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

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

checkベストアンサー

0

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

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

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

import numpy as np

df = a.set_index([np.ones(len(a), dtype='int')])\
  .join(b.set_index([np.ones(len(b), dtype='int')]), rsuffix='_b')\
  .join(c.set_index([np.ones(len(b), dtype='int')]), lsuffix='_a', rsuffix='_c')\
  .reset_index(drop=True)
df.to_csv('time.csv')

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

import itertools

df2 = pd.DataFrame(itertools.product(a['time'], b['time'], c['time']),
                   columns=['atime', 'btime', 'ctime'])
df2.to_csv('time.csv')

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/06/02 22:40

    回答ありがとうございます。

    何パターンも提示していただきありがたい限りです。今回Dataframeを利用したのと、joinやmergeについて分かったこと、withについてもわかりやすく書いていただいたことからベストアンサーにさせていただきます。
    Dataframeに変換するのが早く、他に組み込んでいるシステムとの繋がりも良かったので使わせていただきました。

    また、Dataframeの変換に関して、自分ではどうしても数値が総和になってしまったのですが、別々のセルに入れることができたのは何故でしょうか?大変恐縮ではございますがご教授いただければ幸いです。

    キャンセル

  • 2019/06/03 11:49

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

    キャンセル

  • 2019/06/12 15:39

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

    キャンセル

0

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

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

import itertools
import pandas as pd

df = pd.DataFrame(columns=['a','b','c'])

a,b,c = [1,2,3], [4,5,6], [7,8,9]
for aa,bb,cc in itertools.product(a,b,c):
    dfp = pd.DataFrame({'a':[aa], 'b':[bb], 'c':[cc]})
    df = pd.concat([df, dfp], axis=0)

print(df.reset_index(drop=True))
"""
    a  b  c
0   1  4  7
1   1  4  8
2   1  4  9
3   1  5  7
:
"""

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/06/02 22:47

    回答ありがとうございます。

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

    キャンセル

0

セルを分けるだけなら

import itertools
import csv

a, b, c = [1, 2, 3], [4, 5, 6], [7, 8, 9]

with open('result.csv', 'w') as fw:

    writer = csv.writer(fw, dialect='excel', lineterminator='\n')

    # ヘッダー
    writer.writerow([
        "atime",
        "btime",
        "ctime",
    ])

    # データ
    for i in itertools.product(a, b, c):
        # print(i)

        writer.writerow(i)

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/06/02 22:43

    回答ありがとうございます。

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

    キャンセル

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

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

関連した質問

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