データ説明
100行・3列(ラベルにyear
とcategories
)からなるデータフレームdf_test
というものがあるとします。
以下、イメージの表です(見づらくて申し訳ございません)。
ID | year | categories |
---|---|---|
0 | 2010 | [{'id': 'closed', 'name': 'Closed', 'description': 'No freely available copy has been identified'}] |
1 | 2011 | [[{'id': 'oa_all', 'name': 'All OA', 'description': 'Article is freely available'}, {'id': 'gold_bronze', 'name': 'Bronze', 'description': 'Freely available on publisher page, but without an open licence'}] |
... | ... | ... |
100 | 2011 | [{'id': 'oa_all', 'name': 'All OA', 'description': 'Article is freely available'}, {'id': 'gold_pure', 'name': 'Pure Gold', 'description': 'Version Of Record (VOR) is free under an open licence from a full OA journal'}] |
このcategories
列の要素を見てみると、dicts in listとなっています。
得たい結果
今回のcategories
列の要素には、2つの形式のデータがあります。
それぞれどのような形式であり、どんなデータを取得したいかについて、下記に示します:
0. [{..., 'name':'XXX', ...}]
のようにlistの中に一つだけdictがある形式(ex. IDが0の行)→key'name'
に関するvalueを取得したい
[{..., 'name':'XXX', ...}, {..., 'name':'XXX', ...}]
のようにlistの中に2つdictがある形式(ex. IDが1および
100の行)→2つ目のdictのkey'name'
に関するvalueを取得したい
そして、上記で取得したvalueとyear
のデータを紐付けて、各yearでそれぞれvalueが何件づつあるかをグラフ化したいです。
現状以下のようにコーディングしてみました(環境: google colaboratory)
python
1# categoriesをカウントして列名をリネームする 2categories = df_test['categories'].value_counts() 3categories = categories.to_frame().reset_index().rename(columns= {"index": 'categories', 'categories': 'count'}) 4categories.index.name = 'index' 5 6 7# 表示させたい個数のしきい値 8THRESHOLD = 5 #今回は適当に5件とした 9 10# 欠損値の処理 11df_test.fillna("-no value-", inplace=True) 12 13# しきい値の適応 14df_test = df_test[df_test['categories'].isin(list(categories[:THRESHOLD]['categories']))].sort_values('categories') 15 16# ヒストグラムを示す 17px.histogram(df_test, 18 x="year", 19 color="categories", 20 title=f"Top {THRESHOLD} categories - by year")
これで結果は一応でるのですが、今の状況ではcategories
の要素(dicts in list)がすべてそのまま出力されてしまいます。
dictのkey'name'
に関するvalueに絞った描画がしたいです。
ご指導のほど、どうぞよろしくお願いいたします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/26 14:48
2020/09/26 15:01
2020/09/28 00:16
2020/09/28 15:23 編集
2020/09/29 00:18