我是初学者。我四处张望,阅读了一堆相关问题,但还不太清楚。我知道我是问题所在,而且我想念一些东西,但我希望有人能帮助您。我正在尝试将一种视频游戏(大学篮球模拟)中的数据转换为与另一种视频游戏(职业篮球模拟)格式一致的数据。
我有一个包含列的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
答案 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
我们可以看到分配了随机值,即使它们都匹配两个条件之一。尽管与迭代和选择随机值相比,这种方法的内存效率较低,但是由于我们创建了大量未使用的数字,因此,由于这些是矢量化操作,因此它仍会更快。