2017-09-29 27 views
1

我想做一个随机函数来选择随机参与者进入游戏。基本上我的逻辑是:python - 为什么使用random.choice()时会出现这个键错误:0?

    随机
  1. 从数据帧柱(使用random.choice())
  2. 涂黑名称通过用NaN的
  3. 重新运行

替换它选择1名对于第二次运行,使用random.choice方法时出现Key Error: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次以获得一个名字? c_name将始终是最后一个循环的结果。 我不知道如何选择与数据框相结合的行为。我知道如何使用列表,但可能是差异 –

回答

2

第一个错误是:

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

由于random.choice接受一个序列:

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

所以给定一个数据帧,将隐式地改变DF到由每个索引的列表。如果索引不连续,它会引发错误。

+0

谢谢!但是,如果在索引不连续时将df-into-list转换为错误,为什么我可以追加'.tolist()'函数将它转换为列表就好了?是否因为random.choice正在创建一个序列(我猜它必须是连续的)而不是普通的列表? – addicted

相关问题