如何有效地将功能应用于大熊猫数据框的行?

可恶的

我试图从当前数据集中为模型创建训练数据集。二十一点,每一行都是玩家如何玩牌。

该表可能如下所示:

|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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何有效地将功能应用于熊猫面板的每个数据框

如何有效地将pos_tag_sents()应用于熊猫数据框

如何有效地将 rbinom 函数应用于数据框中的每一行?

有效地拆分熊猫数据框并将方法应用于子集

在大熊猫中有效地对数据框进行分组?

如何有效地将函数应用于大型熊猫系列?

如何有效地将pandas.Timestamp函数应用于整个数据框/列?

如何有效读取大熊猫数据框?

根据位置将功能有效地应用于每个像素

有效地将列中的功能应用于其他列

如何将矩阵变换有效地应用于NumPy数组的每一行?

如何根据条件有效地将函数应用于数组中的值?

如何有效地将条件应用于numpy数组的索引?

如何有效地将函数逐行应用于NumPy矩阵

如何有效地组合熊猫数据框

将不同的聚合函数应用于熊猫数据框的不同列的Python方式?并有效地命名列?

大熊猫应用于数据框列以返回带有后缀的多个列

如何有效地将熊猫数据框转换为图像数组?

如何有效地从熊猫数据框中减去每一行?

使用大熊猫为大型数据帧有效地计算每个时间段的值

遍历和更新大熊猫数据框中的行的最有效方法

将功能应用于数据框列的最有效方法

numpy 的替代方法,用于有效地将条件应用于数组

有效地获取大熊猫间隔类别的右边缘

将功能按行应用于熊猫数据框

大熊猫*有效地*将有效值按组复制到其他行

有效地将阈值函数应用于 SciPy 稀疏 csr_matrix

将函数有效地应用于numpy数组中的球面邻域

如何将功能应用于GROUPWISELY数据框的所有列?(在python熊猫中)