🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python

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

pandas

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

Q&A

解決済

2回答

769閲覧

【Python】Pandasデータフレームから目的の形への変換

SMRKW

総合スコア2

Python

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

pandas

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

0グッド

0クリップ

投稿2021/03/18 16:33

編集2021/03/18 16:34

現在行いたいこととして、
以下の①データフレームを②の形に変換したいと考えています。
※FLAGは何回目のメルマガを見たか、に当てはまるデータです(1~50まで)。

ーーー
<保有するデータフレーム>

Index ID FLAG

1 aaa 2
2 aaa 10
3 aaa 40
4 bbb 3
5 bbb 7
6 bbb 25
7 bbb 36
8 bbb 49
9 ccc 1
10 ccc 4

<得たいデータフレームの形>

ID FLAG 1 2 3 4 5 6 7 8 9 10 ・・・

aaa    0 1 0 0 0 0 0 0 0 1
bbb    0 0 1 0 0 0 1 0 0 0
ccc    1 0 0 1 0 0 0 0 0 0

IDごとに行がまとめられており、
列にはFLAG番号ごとに当てはまるものに1,そうでないものに0が入っているようなイメージです。

Pandasを色々調べてみたのですがどういう処理をすればよいのかわからず、質問させていただきます。

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

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

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

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

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

guest

回答2

0

ベストアンサー

python

1>>> df 2 ID FLAG 3Index 41 aaa 2 52 aaa 10 63 aaa 40 74 bbb 3 85 bbb 7 96 bbb 25 107 bbb 36 118 bbb 49 129 ccc 1 1310 ccc 4

上記のようにIndexがインデックスになっているならば以下のように出来ます。
インデックスでなければ、この前にset_indexでインデックスにしてください。

python

1>>> df_temp = pd.DataFrame({'ID': [f'temp__{i+1}' for i in range(50)], 'FLAG': [i+1 for i in range(50)]}) 2>>> 3>>> df2 = pd.concat([df, df_temp]) 4>>> df3 = pd.get_dummies(df2, prefix='', prefix_sep='', columns=['FLAG']) 5>>> df4 = df3.iloc[:df.shape[0]] 6>>> df5 = df4.groupby('ID').sum() 7>>> df5 8 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ... 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 9ID ... 10aaa 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 ... 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 11bbb 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 ... 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 12ccc 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 13 14[3 rows x 50 columns]

投稿2021/03/18 23:48

ppaul

総合スコア24670

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

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

SMRKW

2021/03/19 00:39

ありがとうございます!無事できました!
guest

0

列にはFLAG番号ごとに当てはまるものに1,そうでないものに0が入っているようなイメージ
Pandasを色々調べてみたのですがどういう処理をすればよいのかわからず

このような処理はone-hot encodingと呼ばれています。
名前が分かればすぐにやり方は見つかりますので、この機会にぜひ覚えてください。


FLAGのワンホット
Index ID 1 2 3 4 7 10 25 36 40 49
0 1 aaa 0 1 0 0 0 0 0 0 0 0
1 2 aaa 0 0 0 0 0 1 0 0 0 0
2 3 aaa 0 0 0 0 0 0 0 0 1 0
3 4 bbb 0 0 1 0 0 0 0 0 0 0
4 5 bbb 0 0 0 0 1 0 0 0 0 0
5 6 bbb 0 0 0 0 0 0 1 0 0 0
6 7 bbb 0 0 0 0 0 0 0 1 0 0
7 8 bbb 0 0 0 0 0 0 0 0 0 1
8 9 ccc 1 0 0 0 0 0 0 0 0 0
9 10 ccc 0 0 0 1 0 0 0 0 0 0

Python3

1import pandas as pd 2""" sample.csv 3Index,ID,FLAG 41,aaa,2 52,aaa,10 63,aaa,40 74,bbb,3 85,bbb,7 96,bbb,25 107,bbb,36 118,bbb,49 129,ccc,1 1310,ccc,4 14""" 15df = pd.read_csv("sample.csv") 16# print("生") 17# print(df) 18 19dat_mod = df.reindex(columns=["Index", "ID", "FLAG"]) 20 21# print("並べ替え後") 22# print(dat_mod) 23 24df_one_hot_flags = pd.get_dummies(dat_mod, columns=["FLAG"]).rename(columns=lambda s:s.replace("FLAG_","")) #.drop("Index",axis=1) 25print("FLAGのワンホット") 26print(df_one_hot_flags)

投稿2021/03/18 22:02

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

SMRKW

2021/03/19 00:40

ありがとうございます!!こんな簡単なやり方があるんですね。調べさせていただきます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問