🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
CSV

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

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

最適化

最適化とはメソッドやデザインの最適な処理方法を選択することです。パフォーマンスの向上を目指す為に行われます。プログラミングにおける最適化は、アルゴリズムのスピードアップや、要求されるリソースを減らすことなどを指します。

Python

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

Q&A

解決済

3回答

3975閲覧

Pythonのopenpyxlでデータの集計を自動化する方法

strawberry_

総合スコア2

CSV

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

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

最適化

最適化とはメソッドやデザインの最適な処理方法を選択することです。パフォーマンスの向上を目指す為に行われます。プログラミングにおける最適化は、アルゴリズムのスピードアップや、要求されるリソースを減らすことなどを指します。

Python

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

0グッド

0クリップ

投稿2021/03/08 11:21

前提

初めて質問をさせていただきます。
Pythonのopenpyxlを使用し、データの集計の自動化をしようとしています。

調べてもどうしても上手くプログラムを書くことができず、ご教授頂けますと助かります・・・。

###実施したいこと
◆集計したいデータについて、以下のような記述の複数あるCSVファイルがあります。
ID 色 回数 データ
101 Blue 1 11
101 Blue 2 22
101 Blue 3 33
101 Blue 4 44
101 Blue 5 55
101 pink 1 0.3
101 pink 2 0.4
101 pink 3 0.5
101 pink 4 0.6
101 pink 5 1.4
108 Blue 1 90
108 Blue 2 94
108 Blue 3 67
108 Blue 4 67.3
108 Blue 5 70.3
108 pink 1 3.3
108 pink 2 5.4
108 pink 3 6.5
108 pink 4 7.6
108 pink 5 8.4

CSVファイルから値を取得し、以下のように続くように値を取得、Excelに反映させたいです。
.  101 101 108 108 #ID
.   blue pink  blue pink  #色
1   11 0.3  90 3.3 #データ
2   22 0.4 67 5.4
3   33 0.5 67.3 6.5
4   44 0.6 70.3 7.6
5   55 1.4 3.3  8.4
↑回数

該当のソースコード

python

1 2import openpyxl 3import os 4 5# 新規スプレッドシート作成 6wb = openpyxl.Workbook() 7sheet = wb.active 8 9n = 0 10 11for filename in os.listdir("."): 12 if not filename.endswith('.csv'): 13 continue 14 15 #ファイルごと列番号を1,2,3...と増やしていく 16 n += 1 17 text_file = open(filename, 'r') 18 19 #行に追加する m =index番号, line = 要素の値 20 for m, line in enumerate(text_file): 21 sheet.cell(row=m+1, column=n, value=line.strip()) 22 23  text_file.close() 24 25wb.save('data.xlsx') 26 27

試したこと

for m, line in enumerate(text_file):
sheet.cell(row=m+1, column=n+1, value=line.strip())
を参考に書き換えてみたのですが、上手くいかず・・(あまりにもグチャグチャなので載せるのはやめておきます。。。)

現状では、ファイルのデータが一行に集約されて入っている状態です。。
初歩的な質問で恐縮ですが、何卒よろしくお願いいたします。

ファイルの回数指定についても
for i in range(1,5):
cell = sheet.cell(row=i+1, column=1, value=(i)

としても上手く反映ができずでした。。

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

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

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

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

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

takutakuya

2021/03/08 12:59

回数、ID、色が全て同じデータは存在しない前提でしょうか?
t_obara

2021/03/08 13:03

単にエクセルのpivotテーブルを使うのではなく、あくまでもpythonを利用したいのですか? pythonを使うにしても、DataFrameのpivotを使えば簡単かと思いますよ。
strawberry_

2021/03/08 13:59

takutakuyaさん >回数、ID、色が全て同じデータは存在しない前提でしょうか? ご閲覧ありがとうございます! はい、同じデータは存在しない前提となります。
strawberry_

2021/03/08 14:05

t_obaraさん >単にエクセルのpivotテーブルを使うのではなく、あくまでもpythonを利用したいのですか? pythonを使うにしても、DataFrameのpivotを使えば簡単かと思いますよ。 ありがとうございます! Pythonもしくは、Excel内で処理をしようと思っていました! 一時諦めてExcel上で操作をしようとしていたところ、上手くできなかったので、pivotテーブル、参考にさせていただきます! pythonのDataFrameのpivotについても、調べてみます! ありがとうございます・・!
guest

回答3

0

Excelの結果でいいのでしたらcolumnsを複数指定でいいのでは

python

1df3 = df2.pivot(index="回数", columns=["ID", "色"], values="データ") 2df3.index.name = None 3df3.to_excel("output.xlsx")

参考までに
Excelのピボットテーブル
イメージ説明
小計と総計は削除しました

投稿2021/03/08 14:30

編集2021/03/09 02:30
barobaro

総合スコア1286

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

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

strawberry_

2021/03/08 14:53

barobaroさん ありがとうございます・・! 無事に期待通りに値を取得することができました・・・! 大変助かりましたm(._.)m
guest

0

ベストアンサー

openpyxlだけでやるのは大変そうなので、pandasを使って作ったものです。

python

1>>> df = pd.read_excel('input.xlsx') 2>>> print(df) 3 ID 色 回数 データ 40 101 Blue 1 11.0 51 101 Blue 2 22.0 62 101 Blue 3 33.0 73 101 Blue 4 44.0 84 101 Blue 5 55.0 95 101 pink 1 0.3 106 101 pink 2 0.4 117 101 pink 3 0.5 128 101 pink 4 0.6 139 101 pink 5 1.4 1410 108 Blue 1 90.0 1511 108 Blue 2 94.0 1612 108 Blue 3 67.0 1713 108 Blue 4 67.3 1814 108 Blue 5 70.3 1915 108 pink 1 3.3 2016 108 pink 2 5.4 2117 108 pink 3 6.5 2218 108 pink 4 7.6 2319 108 pink 5 8.4

ここから加工します。

python

1>>> df2 = df.copy() 2>>> df2['ID色'] = df2.apply(lambda x:(x['ID'], x['色']), axis=1) 3>>> df3 = df2.pivot(index='回数', columns='ID色', values='データ') 4>>> df4 = df3.T.reset_index() 5>>> df4.insert(0,'色', df4['ID色'].apply(lambda x: x[1])) 6>>> df4.insert(0,'ID', df4['ID色'].apply(lambda x: x[0])) 7>>> df4.drop('ID色', axis=1, inplace = True) 8>>> df5 = df4.T 9>>> print(df5) 10 0 1 2 3 11回数 12ID 101 101 108 108 13色 Blue pink Blue pink 141 11 0.3 90 3.3 152 22 0.4 94 5.4 163 33 0.5 67 6.5 174 44 0.6 67.3 7.6 185 55 1.4 70.3 8.4

最後に保存です。

python

1>>> df5.to_excel('output.xlsx', header=False) 2>>>

結果のエクセルは以下でした。
結果のエクセル

投稿2021/03/08 12:57

ppaul

総合スコア24670

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

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

strawberry_

2021/03/08 14:08

ppaulさん、早速ありがとうございます・・・! openpyxlだけでは難しかったのですね。。 pandasについてかなり知識が浅いので、大変勉強になります。 参考にさせていただきますm(._.)m
guest

0

BAに大変悩みましたが、迅速にアドバイスいただきました、ppaulさんにさせて頂きました・・!
barobaroさん、ご閲覧頂いた皆様ありがとうございました・・!

投稿2021/03/08 14:58

strawberry_

総合スコア2

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問