熊猫:根据行中的多个条件,向DF添加带有随机数的新列

时间:2018-09-17 22:01:59

标签: python pandas

我是初学者。我四处张望,阅读了一堆相关问题,但还不太清楚。我知道我是问题所在,而且我想念一些东西,但我希望有人能帮助您。我正在尝试将一种视频游戏(大学篮球模拟)中的数据转换为与另一种视频游戏(职业篮球模拟)格式一致的数据。

我有一个包含列的DF: 名称,位置,身高,体重,铅球,得分

具有以下值: 乔恩·史密斯(Jon Smith),C,84,235,执行,19.4 PG格雷格·琼斯(Greg Jones),年龄72,187,一般,12.0

我想为“ InsideScoring”创建一个新列。我想做的就是根据玩家的身高,身高,体重,射门得分和得分,在一定范围内为玩家分配一个随机生成的数字。

我尝试了很多尝试,例如:

df1['InsideScoring'] = 0
df1.loc[(df1.Pos == "C") &
        (df1.Height > 82) &
        (df1.Points > 19.0) &
        (df1.Weight > 229), 'InsideScoring'] = np.random.randint(85,100)

当我这样做时,所有符合条件的玩家(排在“ InsideScoring”列中)都被分配了85到100之间的相同值,而不是85到100之间的数字随机组合。

最终,我要做的是浏览播放器列表,并根据这四个条件从不同范围分配值。任何想法表示赞赏。

Pandas: Create a new column with random values based on conditional

Numpy "where" with multiple conditions

1 个答案:

答案 0 :(得分:0)

我的建议是在此处使用np.select。您设置了条件,输出了,一切顺利。但是,为避免迭代,还为避免为满足条件的每一列分配相同的随机值,请创建等于您DataFrame长度的随机值,然后从中选择:


设置

df = pd.DataFrame({
    'Name': ['Chris', 'John'],
    'Height': [72, 84],
    'Pos': ['PG', 'C'],
    'Weight': [165, 235], 
    'Shot': ['Amazing', 'Fair'],
    'Points': [999, 25]
})

    Name  Height Pos  Weight     Shot  Points
0  Chris      72  PG     165  Amazing     999
1   John      84   C     235     Fair      25

现在设置范围和条件(根据需要创建尽可能多的条件):

cond1 = df.Pos.eq('C') & df.Height.gt(80) & df.Weight.gt(200)
cond2 = df.Pos.eq('PG') & df.Height.lt(80) & df.Weight.lt(200)

range1 = np.random.randint(85, 100, len(df))
range2 = np.random.randint(50, 85, len(df))

df.assign(InsideScoring=np.select([cond1, cond2], [range1, range2]))

    Name  Height Pos  Weight     Shot  Points  InsideScoring
0  Chris      72  PG     165  Amazing     999             72
1   John      84   C     235     Fair      25             89

现在要确认这不会多次分配值:

df = pd.concat([df]*5)

... # Setup the ranges and conditions again

df.assign(InsideScoring=np.select([cond1, cond2], [range1, range2]))

    Name  Height Pos  Weight     Shot  Points  InsideScoring
0  Chris      72  PG     165  Amazing     999             56
1   John      84   C     235     Fair      25             96
0  Chris      72  PG     165  Amazing     999             74
1   John      84   C     235     Fair      25             93
0  Chris      72  PG     165  Amazing     999             63
1   John      84   C     235     Fair      25             97
0  Chris      72  PG     165  Amazing     999             55
1   John      84   C     235     Fair      25             95
0  Chris      72  PG     165  Amazing     999             60
1   John      84   C     235     Fair      25             90

我们可以看到分配了随机值,即使它们都匹配两个条件之一。尽管与迭代和选择随机值相比,这种方法的内存效率较低,但是由于我们创建了大量未使用的数字,因此,由于这些是矢量化操作,因此它仍会更快。