我试图从当前数据集中为模型创建训练数据集。二十一点,每一行都是玩家如何玩牌。
该表可能如下所示:
|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
我想只用玩家手,庄家发牌和赢/输的总和就将其分成几行。但是,如果已经玩了2张以上的牌(因此玩家被击中了),那么id希望在每个阶段的游戏中为该示例制作多行(因此在每次玩家击中之前)
因此,示例将变为:
|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)
不是最有效或最有效的功能。
所以我想知道我是不是在错误的树上吠叫,试图通过对每行应用一个函数来做到这一点,或者是否有更好的方法?
让我知道是否不清楚。干杯!
您可以使用melt将数据转换为长格式,添加累加和,然后仅排除卡3-5的零卡值。并排除卡1,因为玩家将始终拥有至少2张卡。
这是您作为数据框的示例:
import pandas as pd
import numpy as np
raw = pd.DataFrame({'Card1': [7, 4],
'Card2': [10, 3],
'Card3': [0, 10],
'Card4': [0, 0],
'Card5': [0, 0],
'DealerCard1': [10, 8],
'PlayerTotal': [17, 17],
'Win/Lose': [0, 1]})
raw.index.name = 'Game'
使用melt创建另一个长格式的数据框:
df = (raw.reset_index()
.melt(value_vars=['Card1', 'Card2', 'Card3', 'Card4', 'Card5'],
id_vars=['Game', 'DealerCard1', 'Win/Lose'],
value_name='CardValue',
var_name='Card')
.sort_values('Game')
.reset_index(drop=True))
重新创建PlayerTotal列作为累积和:
df['PlayerTotal'] = df.groupby('Game')['CardValue'].apply(np.cumsum)
然后,您可以只排除卡1和零卡,然后选择所需的列:
df.loc[(df['CardValue']!=0) & (df['Card']!='Card1'), ['PlayerTotal', 'DealerCard1', 'Win/Lose']]
那会给你:
PlayerTotal DealerCard1 Win/Lose
1 17 10 0
6 7 8 1
7 17 8 1
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句