【发布时间】:2020-10-09 15:51:07
【问题描述】:
UPDATE2:我实际上有 2000 次而不是 3 次。
更新:我的 df 列 A 错误。我修好了。
我在下面有一个非常大的df 版本。
data = {'A':[11111, 11111, 33333,11111], 'B':[101, 101, 102, 101],'C':[1,2,3,4],
'draw0':[5, 6, 2, 1], 'draw1':[4,3,2,1], 'draw2':[2,3,4,6]}
df = pd.DataFrame(data)
A B C draw0 draw1 draw2
0 11111 101 1 5 4 2
1 11111 101 2 6 3 3
2 33333 102 3 2 2 4
3 11111 101 4 1 1 6
我正在尝试找出每次抽奖中哪个抽奖列获胜。以下是我目前的尝试,但速度很慢,但有效。我觉得应该有一种方法可以让应用程序更快。
draw_cols = [col for col in df if col.startswith('draw')]
for col in draw_cols:
max_idx = df.groupby(['A', 'B'])[col].idxmax().values
df.loc[max_idx, col] = 1
df.loc[~df.index.isin(max_idx), col] = 0
期望的输出:
A B C draw0 draw1 draw2
0 11111 101 1 0 1 0
1 11111 101 2 1 0 0
2 33333 102 3 1 1 1
3 11111 101 4 0 0 1
我像这样生成 2000 列:
def simulateDraw(df, n=2000):
#simulate n drawings from the alpha and beta values and create columns
return pd.concat([df,
df.apply(lambda row: pd.Series(np.random.beta(row.C, row.C, size=n)), axis = 1).add_prefix('draw')],
axis = 1)
【问题讨论】:
-
你的预期输出是什么?
-
判断哪个抽奖列获胜的逻辑是什么?
-
我更新了 A 列。我的解决方案现在有效,但仍然很慢
-
np.where 在同一时间对每个组的所有绘图进行矢量化。因此,如果您相对于组有较大的平局,则 np.where 将是更优化的解决方案
标签: python pandas performance