python - 为什么我在使用random.choice()时会出现此键错误:0?

时间:2017-09-29 07:33:41

标签: python

我正在尝试使用随机函数来选择随机参与者进入游戏。基本上我的逻辑是:

  1. 从dataframe列中随机选择1个名称(使用random.choice())
  2. 用NaN
  3. 替换该名称
  4. 重新运行
  5. 对于我的第二次运行,当使用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的名称。

1 个答案:

答案 0 :(得分:2)

第一个错误是:

  

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

由于random.choice采用了一个序列:

  

random.choice(seq)从非空序列中返回一个随机元素   起。如果seq为空,则引发IndexError。

所以给定一个数据帧,它会隐式地将每个索引的df更改为一个列表。如果索引不连续,则抛出错误。