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

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

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

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

pandas

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

Q&A

解決済

1回答

403閲覧

pandasを使用してExcelファイルに出力

xxyyxx

総合スコア40

Python

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

pandas

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

0グッド

1クリップ

投稿2019/06/03 23:22

pandasを使用してExcelファイルにデータを書き込みを考えています。

Excelファイルの書き込む際、シート別に書き込む想定です。

汚いコードですが現状こうなっております。

COLUMNS = ['a', 'b', 'c', 'd'] df = pd.DataFrame(columns=COLUMNS) for v1 in data: for v2 in v1['values']: tmp_se = pd.Series([v2['fields']['key'], v2['name'], v2['fields']['fields1'], v2['fields']['fields2'], index=df.columns) df = df.append(tmp_se, ignore_index=True) with pd.ExcelWriter('test.xlsx') as writer: df.to_excel(writer, index=False, sheet_name='sheet'+str(v1['name']), encoding='utf-8')

これだと、一番最後のforで回したデータのみExcelに書き込まれます。
forで強引に回していて、1回分回したものを1シートを書き込みたいです。

書き込むデータ(変数data)はさほど多くはないことを想定していますが、
多くなった場合のことを考えると、for入れ子にして記載すると遅くなってしまうので、できれば違う書き方にしたいと考えています。

質問内容不足していましたら申し訳ないのですが、ご教授のほどよろしくお願い致します。

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

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

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

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

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

waku_nagoya

2019/06/04 01:10

dataはどのような構造になっていますか? ちょっとこのコードだけだと何をしたいのか、いまいち分かりにくいです。
xxyyxx

2019/06/04 01:13

データはjson形式になって変数dataに入っています!
waku_nagoya

2019/06/04 01:19

サンプルデータを載せれますか?
xxyyxx

2019/06/04 02:51

``` { 'expand': 'schemanames', 'startAt': 0, 'maxResults': 100, 'total': 150, 'issues': [{ 'expand': 'operations,versionedRepresentations,editmeta,changelog,renderedFields', 'id': '111111', 'self': 'https://sample.jp//api/2/project/111111', 'key': '911', 'fields': { 'parent': { 'id': '54321', 'key': '11', 'self': 'https://sample.jp//api/2/project/11112' } } }], 'issues': [{ 'expand': 'operations,versionedRepresentations,editmeta,changelog,renderedFields', 'id': '222222', 'self': 'https://sample.jp//api/2/project/222222', 'key': '912', 'fields': { 'parent': { 'id': '54320', 'key': '11', 'self': 'https://sample.jp//api/2/project/11142' } } }] } ``` こんなかんじです! 実際はissuesのネストがもう少しあるかんじです。
guest

回答1

0

ベストアンサー

その json データでは、 issues キーが重複するため、どんどん上書きされていって最後の issues のみ残ってしまいます。
そこを改良してください。

ここから追記です。

filename : tera.json

json

1{ 2 "expand": "schemanames", 3 "startAt": 0, 4 "maxResults": 100, 5 "total": 150, 6 "issues": [ 7 { 8 "expand": "operations,versionedRepresentations,editmeta,changelog,renderedFields", 9 "id": "111111", 10 "self": "https://sample.jp//api/2/project/111111&#039", 11 "key": "911", 12 "fields": { 13 "parent": { 14 "id": "54321", 15 "key": "11", 16 "self": "https://sample.jp//api/2/project/11112&#039" 17 } 18 } 19 }, 20 { 21 "expand": "operations,versionedRepresentations,editmeta,changelog,renderedFields", 22 "id": "111112", 23 "self": "https://sample.jp//api/2/project/111111&#039", 24 "key": "912", 25 "fields": { 26 "parent": { 27 "id": "54322", 28 "key": "12", 29 "self": "https://sample.jp//api/2/project/11112&#039" 30 } 31 } 32 } 33 ], 34 "issues2": [ 35 { 36 "expand": "operations,versionedRepresentations,editmeta,changelog,renderedFields", 37 "id": "222222", 38 "self": "https://sample.jp//api/2/project/222222&#039", 39 "key": "912", 40 "fields": { 41 "parent": { 42 "id": "64320", 43 "key": "21", 44 "self": "https://sample.jp//api/2/project/11142&#039" 45 } 46 } 47 }, 48 { 49 "expand": "operations,versionedRepresentations,editmeta,changelog,renderedFields", 50 "id": "3333", 51 "self": "https://sample.jp//api/2/project/222222&#039", 52 "key": "913", 53 "fields": { 54 "parent": { 55 "id": "54321", 56 "key": "22", 57 "self": "https://sample.jp//api/2/project/11142&#039" 58 } 59 } 60 } 61 62 ] 63} 64

こんな構造のjsonだったとしたら

python

1import pandas as pd 2from pandas.io.json import json_normalize 3import openpyxl 4 5f= open("tera.json", "r") 6data = json.load(f) 7 8with pd.ExcelWriter("test.xlsx") as writer: 9 for v in data: 10 if "issues" in v: 11 r = json_normalize(data[v]) 12 r.to_excel(writer, sheet_name=v)

これで大体やりたいことはできるかと思います。

jsonを修正したところとしては、issues のキー名を重複しないように変更したことです。
もっと構造を変えてもよければ、issues自体をリスト化することです。
そうするともう少しスマートになるかと。

投稿2019/06/04 04:20

編集2019/06/04 06:56
waku_nagoya

総合スコア200

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

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

xxyyxx

2019/06/04 04:57

ご回答ありがとうございます! 外部API叩いて返ってくるデータなので1度整形するかんじでしょうか? ありがとうございました。
waku_nagoya

2019/06/04 06:25

jsonの構成によってロジックはだいぶ変わってくると思いますので、次の質問に答えてください。 1. issuesの中に expand は複数入る可能性はありますか? 2. epand が複数入る場合、 各 issues ごとに expand の件数は異なりますか? 3. self の URL は ' の閉じ忘れなのか、化けているだけなのかどちらでしょうか。 少なくとも、python に JSONを取り込む場合は、シングルクォーテーションではなく、正しくダブルクォーテーションに直した方が取り扱いやすいです。
waku_nagoya

2019/06/04 06:52

先にサンプルを載せておきますね。
xxyyxx

2019/06/07 02:48

ありがとうございます!! 是非参考にさせて頂きますm(_ _)m
xxyyxx

2019/06/07 02:48

コメントが遅れてしまい申し訳ございませんでした、、
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問