我正在尝试从一个当前的数据集创建一个用于模型训练的数据集。该数据集是关于二十一点游戏的,每一行代表一个玩家如何打牌。
这个数据表可能长这个样子:
|Card1|Card2|Card3|Card4|Card5|PlayerTotal|DealerCard1|Win/Lose
| 7 | 10 | 0 | 0 | 0 | 17 | 10 | 0
| 4 | 3 | 10 | 0 | 0 | 17 | 8 | 1
我希望将其转化为仅包含玩家手中的牌、庄家手中的牌和胜利/失败总和的行。然而,如果已经发出了超过两张牌(因此玩家要求加牌),则我希望在每个阶段(玩家每次加牌之前)制作该样本的多个行。
因此,示例将变为:
|PlayerTotal|DealerCard1|Win/Lose
| 17 | 10 | 0
| 7 | 8 | 1
| 17 | 8 | 1
如何有效地实现这个功能?
对于小数据集,我可以使用pd.apply和自定义函数(带有if语句)轻松完成此操作,但是一旦我使用整个数据集(约1百万个数据点),它就会非常慢且占用大量内存。
类似于这样:
def extractRounds(x):
totals = []
totals.append(x[0:2], x[5], x[6]])
if x[2] > 0:
totals.append([sum(x[0:3]), x[5], x[6]])
else:
return pd.Series(totals)
if x[3] > 0:
totals.append([sum(x[0:4]), x[5], x[6]])
else:
return pd.Series(totals)
if x[4] > 0:
totals.append([sum(x[0:5]), x[5], x[6]])
return pd.Series(totals)
b = (a.apply(extractRounds, axis = 1)).stack()
我猜测不太高效或有效的是extractRounds(x)
函数。
所以,我想知道是否尝试对每一行应用函数是错误的方法,或者有更好的方法?
如果这不清楚,请告诉我。谢谢!