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

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

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

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

pandas

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

Q&A

解決済

2回答

1190閲覧

get_dummysを使ってone hotエンコーディングをしようとしているが重複の対応の処理が上手くできない

ROKUNO

総合スコア10

Python

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

pandas

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

0グッド

0クリップ

投稿2020/07/22 22:21

編集2020/07/22 22:39

Python初心者です。Python3を使っており、pandas dataframeのget_dummysで解決しようとして詰まっております。

前提・実現したいこと

DataFrame(1もしくは2)を元に0, 1のone hotに置き換えをしたい。

手元には加工用のデータとしてDataFrame1もしくはDataFrame2があります。idは個人で、これまで住んだことのある場所がlocationにでてきます。多くの人は同じ国にいますが、移動される方がいるので、locationを複数持ってる人がいるような形のデータです。

#加工に使用した元データ #DataFrame1 #id location #12 japan #9 china : #8 taiwan #10 usa #12 usa #10 canada #10 japan #もしくはこの形でも対応できます #DataFrame2 #id location #12 japan, usa #9 china : #8 taiwan #10 usa, canada, japan
#最終的に完成してほしい形 #DataFrame3 #id japan usa china canada taiwan #12 1 1 0 0 0 #9 0 0 1 0 0 : #8 0 0 0 0 1 #10 1 1 0 1 0

実際に算出するステップとしてはいくつか方法を考えましたが、idの数が多く(1万行ほど)、自分のPCのスペックだと処理に時間がかかる、リソースが足りないなどで、詰まっています。
1.DataFrame1でget_dummysを実施し各行ごとにone hotを作成。重複のあるものを後から足し合わせようとしたが、時間がかかり失敗。
2.get_dummysを使用せずに、同一のidを抽出後、作成しておいたtempleteに、該当の国名があれば、1を入れるようにする。時間がかかり同じく失敗。
3.事前に重複があるものを別々のdataframeに切り分けて、get_dummysを実行。カラムなどを揃えて、あとからmergeしようとするが失敗。

効率的に対応できるTipsなどアドバイスをいただけると大変有り難いです。

*今回のdataframeは質問用に作成したものです。

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

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

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

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

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

guest

回答2

0

前者なら

python

1df1_onehot = ( 2 pd.get_dummies(df1, columns=["location"], prefix="", prefix_sep="",) 3 .groupby(by="id") 4 .any() 5 .astype(int) 6)

後者なら

python

1df2_onehot = df2.set_index("id").location.str.get_dummies(sep=", ")

投稿2020/07/23 00:48

yymmt

総合スコア1615

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

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

ROKUNO

2020/07/26 10:03

ありがとうございます!どちらのケースでも実施することができ大変助かりました。
guest

0

ベストアンサー

get_dummies() → groupby("Id") → sum() でできます。

python

1import pandas as pd 2 3df = pd.DataFrame( 4 { 5 "Id": [12, 9, 8, 10, 12, 10, 10], 6 "Country": ["Japan", "China", "Taiwan", "Usa", "Usa", "Canada", "Japan"], 7 } 8) 9 10ret = pd.get_dummies(df, prefix="", prefix_sep="").groupby("Id").sum()
IdCanadaChinaJapanTaiwanUsa
800010
901000
1010101
1200101

仕組み

IdCountry
012Japan
19China
28Taiwan
310Usa
412Usa
510Canada
610Japan

pd.get_dummies(df, prefix="", prefix_sep="")

IdCanadaChinaJapanTaiwanUsa
01200100
1901000
2800010
31000001
41200001
51010000
61000100

groupby("Id")

Id = 8

IdCanadaChinaJapanTaiwanUsa
2800010

Id = 9

IdCanadaChinaJapanTaiwanUsa
1901000

Id = 10

IdCanadaChinaJapanTaiwanUsa
31000001
51010000
61000100

Id = 12

IdCanadaChinaJapanTaiwanUsa
01200100
41200001

sum()

IdCanadaChinaJapanTaiwanUsa
800010
901000
1010101
1200101

投稿2020/07/23 00:24

tiitoi

総合スコア21956

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

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

ROKUNO

2020/07/26 10:03

ありがとうございます。無事に対応でき、また仕組みについても理解できました。今度ともよろしくお願い致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問