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

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

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

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python 3.x

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

pandas

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

Q&A

解決済

2回答

589閲覧

Pandas: 0か1の乱数を条件付で発生させる。

tatpka

総合スコア17

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python 3.x

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

pandas

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

0グッド

0クリップ

投稿2018/12/25 00:38

前提・実現したいこと

以下のようなデータセットがあります。
df = pd.Series({"office_id":[0,0,0,6,6,7,8,14,14,14,14,15,15]})

ここに、 office_idを条件において、0か1かの乱数を発生させて、それをSeriesに結合させてデータフレームを作りたいです。

具体的には、
office_id == 0 のサンプルは3つあるが、そのうちランダムで一つだけ1 あとは0
office_id == 6 のサンプルは2つあるが、そのうちランダムで一つだけ1 あとは0
office_id == 7 のサンプルは1つしかないため、必ず1 をとる。
としたいです。

結果として、
df_new = pd.DataFrame({
"office_id":[0, 0, 0, 6, 6, 7, 8, 14, 14, 14, 14, 15, 15],
"random": [0, 1, 0, 1, 0, 1, 1, 0, 0 ,0 ,1 ,1 ,0]})
といったDataFrameを複数作りたいです。

試したこと

条件なしにただ0か1の乱数の発生はできましたが、
条件付でどうやってやるのかわからなかったため質問しました。

補足情報(FW/ツールのバージョンなど)

よろしくお願いいたします!

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

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

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

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

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

guest

回答2

0

office_id にて groupby() を行い、グループ化したDataFrameより、1つを random.choice() にて選択するという方法はどうでしょうか。

Python

1import pandas as pd 2import random 3 4df = pd.DataFrame({'office_id':[0,0,0,6,6,7,8,14,14,14,14,15,15]}) 5 6df.loc[:, 'random'] = 0 7for idx, grp in df.groupby('office_id'): 8 df.loc[random.choice(grp.index), 'random'] = 1 9print(df) 10# office_id random 11#0 0 0 12#1 0 0 13#2 0 1 14#3 6 1 15#4 6 0 16#5 7 1 17#6 8 1 18#7 14 1 19#8 14 0 20#9 14 0 21#10 14 0 22#11 15 0 23#12 15 1

投稿2018/12/25 02:42

magichan

総合スコア15898

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

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

0

ベストアンサー

以下のようにして条件付きの数列を求めることができます。
ポイントはCounterで数毎の個数を算出し、その数内でのランダム選択位置を控えておく点です。

Python

1import pandas as pd 2from collections import Counter 3import random 4 5df = pd.Series({"office_id":[0,0,0,6,6,7,8,14,14,14,14,15,15]}) 6 7counter = Counter(df[0]) # Counter({14: 4, 0: 3, 6: 2, 15: 2, 7: 1, 8: 1}) 8rnd_pos = {} # 数値毎のランダム選択位置 9cur_pos = {} # 数値毎の現在の位置 10for k,v in counter.items(): 11 rnd_pos[k] = random.randrange(0,v) 12 cur_pos[k] = 0 13print(rnd_pos) # {0: 2, 6: 0, 7: 0, 8: 0, 14: 0, 15: 1} など 14 15rand_col = [] # 求める数列 16for v in df[0]: 17 val = 0 18 if cur_pos[v] == rnd_pos[v]: 19 val = 1 20 rand_col.append(val) 21 cur_pos[v] += 1 22 23print(rand_col) # [0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1] など

投稿2018/12/25 01:16

can110

総合スコア38268

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

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

tatpka

2018/12/27 03:51

うまく作ることができました!ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問