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

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

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

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

Python

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

pandas

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

Q&A

解決済

1回答

756閲覧

Pandas で column が リストに内包された辞書の場合に参照する方法

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

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

Python

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

pandas

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

0グッド

1クリップ

投稿2018/03/11 23:04

編集2018/03/11 23:44

pandas で json を読み込んでdataFrame を作成したのですが
その中のcolumn に 例えば

python

1Status Date 2[{'Quantity':100, 'Price':1000}] 2018-3-11 3[{'Quantity':200, 'Price':300}] 2018-3-12

というようなリストに内包された辞書があり、この辞書の要素を参照したいのですが
やり方が分からず困っています

最終的には、例えば、dateというcolumnがありdateでgroupbyして、辞書のキーを参照してsum()する、ということを実現したいです

いい方法を知っている方いればよろしくお願いします

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

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

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

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

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

guest

回答1

0

ベストアンサー

辞書データをColumnに展開してから処理するというのは駄目でしょうか?

Python

1import pandas as pd 2 3df = pd.DataFrame({ 4 'Date':['2018/1/1','2018/1/2','2018/1/2','2018/1/3','2018/1/3'], 5 'Status':[{'Quantitiy':100, 'Price':1000}, 6 {'Quantitiy':10, 'Price':5000}, 7 {'Quantitiy':50, 'Price':1500}, 8 {'Quantitiy':500, 'Price':100}, 9 {'Quantitiy':125, 'Price':750}] 10}) 11df['Date'] = pd.to_datetime(df['Date']) 12print(df) 13# Date Status 14#0 2018-01-01 {'Quantitiy': 100, 'Price': 1000} 15#1 2018-01-02 {'Quantitiy': 10, 'Price': 5000} 16#2 2018-01-02 {'Quantitiy': 50, 'Price': 1500} 17#3 2018-01-03 {'Quantitiy': 500, 'Price': 100} 18#4 2018-01-03 {'Quantitiy': 125, 'Price': 750} 19 20df = pd.concat([df, df['Status'].apply(pd.Series)],axis=1).drop('Status',axis=1) 21print(df) 22# Date Price Quantitiy 23#0 2018-01-01 1000 100 24#1 2018-01-02 5000 10 25#2 2018-01-02 1500 50 26#3 2018-01-03 100 500 27#4 2018-01-03 750 125 28 29print(df.groupby('Date').sum()) 30# Price Quantitiy 31#Date 32#2018-01-01 1000 100 33#2018-01-02 6500 60 34#2018-01-03 850 625

【修正版】

dictがリストに入っている場合

Python

1import pandas as pd 2 3df = pd.DataFrame({ 4 'Date':['2018/1/1','2018/1/2','2018/1/2','2018/1/3','2018/1/3'], 5 'Status':[[{'Quantitiy':100, 'Price':1000}], 6 [{'Quantitiy':10, 'Price':5000}], 7 [{'Quantitiy':50, 'Price':1500}], 8 [{'Quantitiy':500, 'Price':100}], 9 [{'Quantitiy':125, 'Price':750}]] 10}) 11df['Date'] = pd.to_datetime(df['Date']) 12print(df) 13# Date Status 14#0 2018-01-01 {'Quantitiy': 100, 'Price': 1000} 15#1 2018-01-02 {'Quantitiy': 10, 'Price': 5000} 16#2 2018-01-02 {'Quantitiy': 50, 'Price': 1500} 17#3 2018-01-03 {'Quantitiy': 500, 'Price': 100} 18#4 2018-01-03 {'Quantitiy': 125, 'Price': 750} 19 20df = pd.concat([df, df['Status'].apply(lambda d: pd.Series(d[0]))], axis=1).drop('Status', axis=1) 21print(df) 22# Date Price Quantitiy 23#0 2018-01-01 1000 100 24#1 2018-01-02 5000 10 25#2 2018-01-02 1500 50 26#3 2018-01-03 100 500 27#4 2018-01-03 750 125 28 29print(df.groupby('Date').sum()) 30# Price Quantitiy 31#Date 32#2018-01-01 1000 100 33#2018-01-02 6500 60 34#2018-01-03 850 625

投稿2018/03/11 23:25

編集2018/03/12 03:28
magichan

総合スコア15898

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

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

退会済みユーザー

退会済みユーザー

2018/03/11 23:45

分かりにくい質問で申し訳ないです 編集しましたので見てください
退会済みユーザー

退会済みユーザー

2018/03/11 23:54

ありがとうございます
magichan

2018/03/11 23:59

おっ、コメント書こうとしたら先に解決されておりました。 とりあえずよかったです。 回答の意図としては、『辞書データをそのまま計算するのではなく、最初にColumnに展開しておくと、あとは通常のデータフレーム操作ができるので楽です。』ということです。
退会済みユーザー

退会済みユーザー

2018/03/12 03:09

申し訳ないです、完全に勘違いしていました 間違えて編集後の質問を見ていただく後にお礼のコメントを送ってしまいました。。。 columnの要素自体がリストに内包されている形です
magichan

2018/03/12 03:32

おお!そういうことですか。各辞書がリストに入っているんですね。 一応回答を追加しましたので、確認ください。
退会済みユーザー

退会済みユーザー

2018/03/12 04:19

df = pd.concat([df, df['Status'].apply(lambda d: pd.Series(d[0]))], axis=1).drop('Status', axis=1) この部分でKeyError 0 と出てしまいますね concatについて使ったことがないのですぐに調べますが、 apply(pd.Series)では何が起きているのでしょうか
退会済みユーザー

退会済みユーザー

2018/03/12 04:42

理解できました、ありがとうございました また疑問があったら追記するかもしれません
magichan

2018/03/12 04:46

要は、各セルの辞書型のデータをSeries型に変換を行ってるだけですね。 なにか不明点がありましたら、ご遠慮なく追記してください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問