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

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

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

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

Q&A

解決済

1回答

2574閲覧

dataframe形式のファイルで、あるカラムに出現する要素毎の回数を確認して、その回数を新しいカラムに入れたいです

pickle

総合スコア16

Python

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

0グッド

0クリップ

投稿2020/04/24 12:44

python

1import pandas as pd 2import collections 3 4df = pd.DataFrame({"ID":["a", "a", "b", "c", "d", "c", "b", "a", "d", "e", "a", "a", "b"], 5"date": [2010,2011,2012,2013,2014,2015,2016, 2017, 2018, 2019, 2020,2021,2022]}) 6 7collects = collections.Counter(df["ID"]) 8 9# dfに新しく"出現回数"というカラムをもうける 10df["出現回数"] = 0 #最初は0にしておく。ここに各要素の出現回数をいれていきたい 11 12values, counts = zip(collects) # ここのvalues, countsをdfの一番上から、それぞれ"ID", "出現回数"のカラムにいれたい 13 14# 参考:https://note.nkmk.me/python-collections-counter/ 15 16--------------------------------------------------------------------------- 17ValueError Traceback (most recent call last) 18<ipython-input-50-8616ac2a74f3> in <module> 19 9 df["出現回数"] = 0 #最初は0にしておく。ここに各要素の出現回数をいれていきたい 20 10 21---> 11 values, counts = zip(collects) # ここのvalues, countsをdfの一番上から、それぞれ"ID", "出現回数"のカラムにいれたい 22 12 23 13 # 参考:https://note.nkmk.me/python-collections-counter/ 24 25ValueError: too many values to unpack (expected 2)

上記の様なdfの"ID"という列における要素毎の出現回数をカウントし、それを新しいカラム"出現回数"に戻したいと考えていますが、上記の様なerrorが出現してしまいます。

すみませんが、おわかりになる方ご回答頂けますと幸いです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

Python

1values, counts = zip(collects)

の行で行いたいことは

Python

1values, counts = collects.keys(), collects.values() 2print(values) 3#dict_keys(['a', 'b', 'c', 'd', 'e']) 4print(counts) 5#dict_values([5, 3, 2, 2, 1])

ではないでしょうか。
collects は dict型なので、 .keys() でキーのリストが、 .values() で値のリストを得ることができます。

が。。。。

今回行いたい処理は、上記のようにcollectionsをつかって処理をする必要は全く無く、pandas の機能で簡単に実現することができます。

Python

1# IDの値毎に数を数えて、出現回数列に入れる 2df["出現回数"] = df.groupby('ID').transform('count') 3print(df) 4# ID date 出現回数 5#0 a 2010 5 6#1 a 2011 5 7#2 b 2012 3 8#3 c 2013 2 9#4 d 2014 2 10#5 c 2015 2 11#6 b 2016 3 12#7 a 2017 5 13#8 d 2018 2 14#9 e 2019 1 15#10 a 2020 5 16#11 a 2021 5

投稿2020/04/25 01:58

編集2020/04/25 02:01
magichan

総合スコア15898

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

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

pickle

2020/04/25 05:50

> machichanさん いつも丁寧に回答をありがとうございますm(_ _)m df.groupby("A").transform("count")、でそのように処理ができるのですね。勉強になりました。 この処理で行いたい作業ができました! ただ、一つ疑問があります。 ```python print(collects.most_common()) # [('a', 5), ('b', 3), ('c', 2), ('d', 2), ('e', 1)] ``` とこれ自体ではerrorにならないのに、 ```python values, counts = zip(collects.most_common()) print(values) print(counts) --------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-25-5a8f067a1e2e> in <module> ----> 1 values, counts = zip(collects.most_common()) 2 print(values) 3 print(counts) ValueError: too many values to unpack (expected 2) ``` とzip関数で処理をすると上記の様なerrorが出現してしまうのはなぜでしょうか?
magichan

2020/04/26 03:09

zip の引数として2つ以上のリストデータを渡す必要があるのはご存知かと思いますが zip(collects.most_common()) の場合、zip の引数は1つのリストデータ [('a', 5), ('b', 3), ('c', 2), ('d', 2), ('e', 1)] となります。← エラーの原因 でも実際行いたいことは、5つのリストデータを引数として渡すことかと思いますので、アンパックして values, counts = zip(*collects.most_common()) となるかと思います。
pickle

2020/04/26 12:25

> magichanさん ご回答ありがとうございます。 アスタリスクによるunpackを知りませんでした。 アスタリスクとzipの組み合わせでのunpack、それ程使用する頻度は高くはなさそうですが、こういった形で使用すると勉強になりました。 いつもありがとうございます、助かってますm(_ _)m 今後ともお願い致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問