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ページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答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総合スコア15898
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2018/03/11 23:45
退会済みユーザー
2018/03/11 23:54
2018/03/11 23:59
退会済みユーザー
2018/03/12 03:09
2018/03/12 03:32
退会済みユーザー
2018/03/12 04:19
退会済みユーザー
2018/03/12 04:42
2018/03/12 04:46