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

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

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

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

Q&A

解決済

1回答

779閲覧

データの要素を重複なしで配列化する

tootootoo

総合スコア20

Python 3.x

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

0グッド

0クリップ

投稿2019/05/17 08:11

現在、kaggleの

https://www.kaggle.com/c/whats-cooking-kernels-only/overview

のコンペでpythonを練習しています。

そこで、データ列"ingredients"で材料の種類をまとめた配列を作成しようとしています。

イメージ説明

"ingredients"にはさまざまな材料が配列の中に含まれています。
そこで、"ingredients"内のデータの種類を重複なしで取り出すことはどのようにすればよいでしょうか。

私の案としては

python

1 2 3#①配列要素をすべて足す。 4all = train["indredients].sum() 5#値をカウントすして、その列を取得する 6ingredients_array = all.value_counts().columns

です。できるとは思うのですが、データ数が多く、かなり時間がかかってしまいます。
そこで何かライブラリを使った方法やもっと時間短縮可能な方法を教えていただけたらと思います。
宜しくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

  1. apply() で pd.Series() を train['ingredients'] の各要素に適用し、リストを Series に変換する。
  2. stack() で結合する。
  3. value_counts() で集計する。

python

1import pandas as pd 2 3train = pd.read_json('train.json') 4 5ingredients = train['ingredients'].apply(pd.Series).stack().value_counts() 6print(ingredients)
salt 18049 onions 7972 olive oil 7972 water 7457 garlic 7380 sugar 6434 garlic cloves 6237 butter 4848 ... cooked beetroot 1 raspberry juice 1 arak 1 garlic herb spreadable cheese 1 saki 1 shank half 1 Length: 6714, dtype: int64

こちらの環境では、データ読み込み ~ 集計までの処理をあわせて 10.7 秒かかりました。

別解

pandas を絡めると遅くなるので、データフレームにこだわらないのであれば、標準ライブラリを使って以下のように集計することもできます。
こちらのほうが10倍高速です。

python

1import json 2from collections import Counter 3 4with open('train.json') as f: 5 train = json.load(f) 6 7# 1次元配列にする。 8ingredients = [item for sample in train for item in sample['ingredients']] 9 10# 集計する。 11cnt = Counter(ingredients).items() 12# ---- ここまでの処理で 952 ms 秒 13 14for key, value in cnt: 15 print(key, value)

投稿2019/05/17 08:28

編集2019/05/17 08:47
tiitoi

総合スコア21956

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

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

tootootoo

2019/05/22 08:52

なるほど。とても参考になります。とてもスムーズに処理し終わりました。 誠にありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問