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

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

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

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

Python 3.x

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

Q&A

解決済

1回答

553閲覧

あるカラムに含まれる文字列の値によってランダムデータの値のとる範囲を変えたい

8960

総合スコア108

NumPy

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

Python 3.x

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

0グッド

1クリップ

投稿2022/04/14 03:13

編集2022/04/14 14:43

前提

Pythonのnumpyで作成するランダムデータに関する質問です。

ランダムデータを作成したいのですが、いくつか条件があります。
●Type”FF”
・Score1が150.0~160.0の範囲
・Score2が20.0~50.0の範囲
・Score3が20.0~40.0の範囲
●Type"SL"
・Score1が140.0~150.0の範囲
・Score2が-50.0~30.0の範囲
・Score3が-40.0~40.0の範囲

のように、ランダムで作成する中でもdf["Type"]の値によって、とる範囲を変化させたいです。

以下のコードのように、ランダムデータ全体の範囲指定はできたのですが、Typeでさらに範囲を区別する方法が分かりません。

詳しい方、ご教授の程よろしくお願いいたします。

該当のソースコード

Python

1## ランダムデータの作成 2import pandas as pd 3import numpy as np 4 5pd.options.display.float_format="{:.2f}".format 6 7N = 1000 8type = ["FF","SL"] 9type = np.random.choice(type,size=N) 10df = pd.DataFrame({ 11 "Type":type, 12 "Score1":np.random.sample(N) * 20.0 + 140.0, 13 "Score2":np.random.sample(N) * 100.0 - 50.0, 14 "Score3":np.random.sample(N) * 80.0 - 40.0, 15}) 16 17

追記(条件が3種以上の場合は?)

Python

1## ランダムデータの作成 2import pandas as pd 3import numpy as np 4 5pd.options.display.float_format="{:.2f}".format 6type = ["FF","SL","CU"] 7N = 1000 8type = np.random.choice(type,size=N) 9df = pd.DataFrame({ 10 "Pitch Type":type, 11 "Score1":[np.random.rand()*10+150 if t == "FF" elif np.random.rand()*20+130 if t == "SL" else np.random.rand()*10+140 for t in type], 12 "Score2":[np.random.rand()*40+30 if t == "FF" else np.random.rand()*20+30 for t in type], 13 "Score3":[np.random.rand()*20+20 if t == "FF" else np.random.rand()*30-10 for t in type], 14}) 15

追記(発生しているエラー)

File "C:\Users\DELL\AppData\Local\Temp/ipykernel_18992/3232225939.py", line 13 "Score1":[np.random.rand()*10+150 if t == "FF" elif np.random.rand()*20+130 if t == "SL" else np.random.rand()*10+140 for t in type], ^ SyntaxError: invalid syntax

追記2 - 同じTypeであっても値は一定ではなくランダムに設定したい

Python

1import pandas as pd 2import numpy as np 3import matplotlib.pyplot as plt 4import japanize_matplotlib 5 6pd.options.display.float_format="{:.2f}".format 7 8type = ["FF","CU","SP","SL","SI","CB"] 9 10N = 1000 11type = np.random.choice(type,size=N) 12df = pd.DataFrame({"Type":type}) 13# Score1 14df.loc[df.Type=="FF","Score1"] = np.random.rand()*10+150 15df.loc[df.Type=="CU","Score1"] = np.random.rand()*10+140 16df.loc[df.Type=="SP","Score1"] = np.random.rand()*10+130 17df.loc[df.Type=="SL","Score1"] = np.random.rand()*10+120 18df.loc[df.Type=="SI","Score1"] = np.random.rand()*10+145 19df.loc[df.Type=="CB","Score1"] = np.random.rand()*20+100 20# Score2 21df.loc[df.Type=="FF","Score2"] = np.random.rand()*30+35 22df.loc[df.Type=="CU","Score2"] = np.random.rand()*30+10 23df.loc[df.Type=="SP","Score2"] = np.random.rand()*20+0 24df.loc[df.Type=="SL","Score2"] = np.random.rand()*20-10 25df.loc[df.Type=="SI","Score2"] = np.random.rand()*20+20 26df.loc[df.Type=="CB","Score2"] = np.random.rand()*30-40 27# Score3 28df.loc[df.Type=="FF","Score3"] = np.random.rand()*30+15 29df.loc[df.Type=="CU","Score3"] = np.random.rand()*30-10 30df.loc[df.Type=="SP","Score3"] = np.random.rand()*30+10 31df.loc[df.Type=="SL","Score3"] = np.random.rand()*40-30 32df.loc[df.Type=="SI","Score3"] = np.random.rand()*20+30 33df.loc[df.Type=="CB","Score3"] = np.random.rand()*10-25 34 35#画像サイズ、軸サイズ調整 36plt.figure(figsize=(11,11)) 37#各タイプの色を定義づけ 38pitch_colors = {"FF":"b","SI":"c","SL":"r","SP":"g","CB":"pink","CU":"y"} 39ax1 = plt.subplot(1,1,1) 40 41# make ScatterPlot 42ax1.axis([-70,70,-70,70]) 43x = df[["Score3"]] 44y = df[["Score2"]] 45#各タイプを色別でplot 46for k in pitch_colors: 47 df_selected = df[df['Type'] == k] 48 if not df_selected.empty: 49 df_selected.plot.scatter(x='Score3', y='Score2', marker='o', c=pitch_colors[k], s = 50, label=k, ax=ax1) 50#プロットのグリッド線 51ax1.grid(True,linestyle = "dotted") 52# adding vertical line in data co-ordinates 53ax1.axvline(0, c='silver', ls='-') 54# adding horizontal line in data co-ordinates 55ax1.axhline(0, c='silver', ls='-') 56#凡例の表示 57flg=12 58ax1.legend(loc='upper left',fontsize=flg,title='Type') 59 60 61 62

### 追記2 -現状と理想
現状
イメージ説明

理想(ランダムで作成したものではないため例です)
イメージ説明

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

python3.9、VSCode

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

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

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

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

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

meg_

2022/04/14 11:23 編集

> ランダムデータ全体の範囲指定はできたのですが、Typeでさらに範囲を区別する方法 やりたいことがよく分かりません。 欲しい結果のサンプルを提示いただけませんか? ⇒ これかな?と思った回答をしました。
guest

回答1

0

ベストアンサー

下記の様な感じでしょうか?

Python

1N = 1000 2type = ["FF","SL"] 3type = np.random.choice(type,size=N) 4df = pd.DataFrame({ 5 "Type":type, 6 "Score1":[np.random.rand()*10+150 if t == "FF" else np.random.rand()*10+140 for t in type], 7 "Score2":[np.random.rand()*30+20 if t == "FF" else np.random.rand()*30+50 for t in type], 8 "Score3":[np.random.rand()*20+20 if t == "FF" else np.random.rand()*80-40 for t in type], 9}) 10 11# Type Score1 Score2 Score3 12#0 SL 149.33 53.89 19.64 13#1 SL 141.44 52.39 13.94 14#2 SL 143.82 61.36 -4.54 15#3 SL 148.84 70.24 -11.13 16#4 SL 144.62 62.01 4.39 17#... ... ... ... ... 18#995 SL 143.74 67.70 12.42 19#996 SL 148.16 58.54 35.10 20#997 FF 152.93 44.50 27.76 21#998 SL 147.17 52.88 -9.30 22#999 FF 152.69 29.36 31.51

追加の質問への回答です。
下記のように書くことができます。※コードを一部修正しました。

python

1N = 1000 2type = ["FF","SL","CU"] 3type = np.random.choice(type,size=N) 4df = pd.DataFrame({"Type":type}) 5df.loc[df.Type=="FF", "Score1"] = np.random.sample(len(df[df.Type=="FF"]))*10+150 6df.loc[df.Type=="SL", "Score1"] = np.random.sample(len(df[df.Type=="SL"]))*10+140 7df.loc[df.Type=="CU", "Score1"] = np.random.sample(len(df[df.Type=="CU"]))*10+130 8# Type Score1 9#0 SL 146.079588 10#1 SL 140.209451 11#2 CU 137.696889 12#3 SL 146.422702 13#4 FF 151.401674 14#... ... ... 15#995 SL 149.747729 16#996 SL 148.082197 17#997 SL 143.090960 18#998 FF 154.045560 19#999 FF 152.727737

投稿2022/04/14 11:22

編集2022/04/14 15:01
meg_

総合スコア10579

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

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

8960

2022/04/14 12:34 編集

>meg_ さん ありがとうございます! まさにこれでした。ちなみにですが仮に type = ["FF","SL","CU"] のようにtype(条件)が3種以上になったときはnp.raqndom.rand()以降どのように書くのでしょうか? 質問に追記しましたのでよろしくお願いいたします。
meg_

2022/04/14 13:14

内包表記の場合は3つ以上の条件は使えないかと思います。別の書き方をしてください。一例を回答に追記しましたので参考にしてください。
8960

2022/04/14 14:05 編集

>meg_ さん ありがとうございます! 想像通りのものが出来ました。助かりました。
8960

2022/04/14 14:49

>meg_ さん 申し訳ありません。 グラフ化した段階で少し想像と違うことに気が付きました。 追記2としましたのでできればご確認お願いいたします。 現状では、Typeが同じだとランダムで入る数値も等しくなってしまいます。 理想は、Type=FFで同じデータがあっても(Score2,Score3)が(40.5,30.2)の場合もあれば、(53.2,35.6)のデータも存在する、みたいな感じです。
meg_

2022/04/14 14:59

失礼しました。ランダム値生成方法を見直しました。
8960

2022/04/14 15:39

>meg_ さん 出来ました! ご丁寧にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問