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

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

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

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

Python

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

Q&A

解決済

2回答

253閲覧

Pythonのディクショナリのリストを二次元リスト(テーブル)にしたい

kurosuke___

総合スコア217

Python 3.x

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

Python

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

0グッド

3クリップ

投稿2018/11/12 08:38

以下のようなディクショナリのリストがあったとします。

python

1[ 2 { 3 "name": "kojima", 4 "ref": "a", 5 "score": "11", 6 }, 7 { 8 "name": "kojima", 9 "ref": "b", 10 "score": "35", 11 }, 12 { 13 "name": "tanaka", 14 "ref": "b", 15 "score": "14", 16 }, 17 { 18 "name": "taguchi", 19 "ref": "c", 20 "score": "41", 21 }, 22 { 23 "name": "kimura", 24 "ref": "d", 25 "score": "21", 26 }, 27 { 28 "name": "suzuki", 29 "ref": "e", 30 "score": "54", 31 } 32]

これを

Nameabcde
kojima1135---
tanaka-14---
taguchi--41--
kimura---21-
suzuki----54

このような二次元リストにしたいのですが、どうにもやり方が思いつきません。

いい方法を知ってらっしゃる方がいましたらお願いします。
よろしくおねがいします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

これでどうでしょうか

Python

1import pandas as pd 2 3data = [ 4 { 5 "name": "kojima", 6 "ref": "a", 7 "score": "11", 8 }, 9 { 10 "name": "kojima", 11 "ref": "b", 12 "score": "35", 13 }, 14 { 15 "name": "tanaka", 16 "ref": "b", 17 "score": "14", 18 }, 19 { 20 "name": "taguchi", 21 "ref": "c", 22 "score": "41", 23 }, 24 { 25 "name": "kimura", 26 "ref": "d", 27 "score": "21", 28 }, 29 { 30 "name": "suzuki", 31 "ref": "e", 32 "score": "54", 33 } 34] 35 36print(pd.DataFrame(data).pivot('name','ref','score')) 37#ref a b c d e 38#name 39#kimura None None None 21 None 40#kojima 11 35 None None None 41#suzuki None None None None 54 42#taguchi None None 41 None None 43#tanaka None 14 None None None

投稿2018/11/12 09:04

magichan

総合スコア15898

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

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

kurosuke___

2018/11/12 09:18

回答有り難うございます! おお、これはすごい! やってみたところIndex contains duplicate entries, cannot reshapeというエラーになってしまいました。 nameに重複がある場合はだめという感じなのでしょうか・・・
magichan

2018/11/12 09:29

もしかして、"name"と"ref"が共に共通のDictが2つ以上存在しますか?
magichan

2018/11/12 09:47

とりあえずでよければ print(pd.DataFrame(data).pivot_table(values='score', index='name', columns='ref',aggfunc=np.sum)) でエラーが直ったりしませんか?(重複が結合されるけど)
kurosuke___

2018/11/13 10:40

nameとrefが重複しているものはないですね・・・ ご提示いただいたコードで治りました!ありがとうございます!
magichan

2018/11/13 23:35

重複なしですか・・なんでエラーになるんだろ?? どりあえず pivot_table() だと動作するのですね。 こちらを使うのであれば最初からセルの値が重複することも考慮して df.astype({'score':'int'}) あたりを挟んで scoreをint型に変換したうえで aggfunc に重複した際に行いたい処理 合計(np.sum) 平均(np.mean) などを選択するとよいかと思います
kurosuke___

2018/11/14 21:20

なるほど、柔軟で良いですね!ありがとうございます!
guest

0

panda をつかわずに書いてみました。

d.py

python3

1data = [ 2 { 3 "name": "kojima", 4 "ref": "a", 5 "score": "11", 6 }, 7 { 8 "name": "kojima", 9 "ref": "b", 10 "score": "35", 11 }, 12 { 13 "name": "tanaka", 14 "ref": "b", 15 "score": "14", 16 }, 17 { 18 "name": "taguchi", 19 "ref": "c", 20 "score": "41", 21 }, 22 { 23 "name": "kimura", 24 "ref": "d", 25 "score": "21", 26 }, 27 { 28 "name": "suzuki", 29 "ref": "e", 30 "score": "54", 31 } 32] 33 34table = {"name": list(data[0].keys())} 35for info in data: 36 table[info["name"]] = [row["score"] if row["name"] == info["name"] else "-" for row in data] 37 38# print(table) 39for name, vals in table.items(): 40 print([name] + vals)

実行例:
イメージ説明

投稿2018/11/12 13:37

katoy

総合スコア22324

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

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

kurosuke___

2018/11/13 10:39

回答有り難うございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問