2017-09-29 33 views
1

ランダムな参加者をゲームに選ぶためのランダム化機能を作ろうとしています。基本的に私のロジックがある:python - random.choice()を使用すると、なぜこのKey Error:0が得られますか?

  1. ランダム(random.choiceを(使用))データフレーム列から1名を選択
  2. ブラックその名前うちのNaN
  3. 再実行

でそれを置き換えることによって私の2回目の実行では、random.choiceメソッドを使用しているときにキーエラー:0が表示されています。私はそれをtolist()を使ってリストにすることで修正できます。

は、私は以下のコードで何を意味するか説明してみましょう:

import pandas as pd 
import numpy as np 
from random import choice 

df = pd.DataFrame({'name':['Andy', 'Jack', 'Anne']}) 
for i in range(1,100): 
    c_name = choice(df.name.dropna()) 
df.name.replace(c_name, np.NaN, inplace=True) #Let's say Andy is replaced 

# up until here it will work fine 

# Trying the 2nd run 

for i in range(1,100): 
    c_name = choice(df.name.dropna()) 
# !will output Key Error : 0 
# if I do this: c_name = choice(df.name.dropna().tolist()) it will be fine. 
# if the NaN value is at the last index, it is also fine. 

私の質問は、なぜrandom.choice()ふるまうこのようなものですか?私はdropna()を使ってNaN値を落としました。NaNのない一連の名前として機能するはずです。

+0

サンプルを使用しないのはなぜですか? https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.sample.html 一度にやりたいことをしてください。 –

+0

これは別の優れた解決策です。理由はありません、私はサンプル関数があることを知りませんでした。それでも、なぜ 'random.choice()'がそのように動作しているのかを知りたいです。 – addicted

+0

あなたのコードを実行しないで:なぜあなたのループを100回実行して1つの名前を得るのですか? c_nameは常に最後のループの結果になります。 データフレームと組み合わせた選択肢がどのように動作するかわかりません。私はリストを扱う方法を知っています - それはおそらく差分です –

答えて

2

最初のエラーがある:それは暗黙的に、各索引リストにDFを変化するデータフレームを所定の

random.choice(seq) Return a random element from the non-empty sequence seq. If seq is empty, raises IndexError.

:random.choiceので

result = self.index.get_value(self, key)

シーケンスを取ります。インデックスが連続していない場合は、エラーが発生します。

+0

ありがとう!しかし、インデックスが連続していないときにdf-into-listを変換するとエラーが発生する場合は、 '.tolist()'関数を追加してリストに変換できるのはなぜですか?それは 'random.choice'が通常のリストの代わりにシーケンスを作成しているからです(これは本質的に連続していなければなりません)。 – addicted

関連する問題