之前有多少观察值发生了?

时间:2016-11-17 12:37:15

标签: python pandas

我对Python很陌生,从统计背景进入编程世界。我最近一直在努力完成一项非常简单的任务,尽管把它放到代码中似乎很有挑战性。

我们假设我们有一个手牌号码(手牌数量),作为一列,在第二列中获胜。

DATA

g = pd.DataFrame({'HANDS':[0,1,2,3,4], 'WINNINGS':[1500,0,0,50,0]})

我想获得一个额外的专栏,表明前一次胜利发生了多少手。

期望的输出。

g['VICTORY_LAST'] = [0,1,2,3,1]

如果我完成它并且我的扑克项目证明是有效的,我可能会分享一些底池。 :d

3 个答案:

答案 0 :(得分:1)

这个相当简单的解决方案提供了您的要求。如果有人关心改进它,我也会很高兴:

    <div id="myModalTraffic" class="modal hide fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
<div class="modal-dialog" role="document">
    <div class="modal-content">
        <div class="modal-body">
            <p>One fine body…</p>
        </div>
</div>
</div>
    </div>

我认为代码是不言自明的。如果您有任何疑问,请询问。

答案 1 :(得分:1)

快速而肮脏的例子:

wins = g.WINNINGS > 0

counter = 0
res = []
for win in wins:
    if win:
        if len(res)==0:
            res.append(counter)
            counter =0
        else:
            counter = counter+1
            res.append(counter)
            counter =0

    else:
        counter = counter +1
        res.append(counter)
g['VICTORY_LAST'] = res

答案 2 :(得分:1)

当阵列开始变大时,您可能希望研究矢量化算法。下面是一个矢量化解决方案,它取决于一些numpy函数,它是构建pandas的数值库。

您正在描述类似锯齿的函数:通过在特定索引处重置来线性增加索引。这种轮廓是从线性增加的轮廓中减去类似轮廓的阶梯的结果。每次事件发生时楼梯都会增加,以达到与该指数线性增加线相同的高度。下面的代码执行此操作:

def count_ago(events, unknown_val=np.nan):
    """Count how many samples ago an event occurred.
    Example: events =  np.array([0, 1, 0, 0, 1, 0])
             out= np.array([np.nan, 0, 1, 2, 0, 1])
    """

    dtype = np.min_scalar_type(unknown_val)  # space savings
    linear = np.arange(events.shape[0], dtype=dtype)
    staircase = np.maximum.accumulate((events != 0)*linear)
    sawtooth = linear - staircase
    first_event = np.nonzero(events)[0][0]
    sawtooth[:first_event] = unknown_val
    return sawtooth

如果事件未出现在第一个索引处,则可能会使用unknown_val参数覆盖前几个元素。这解决了“当游戏开始时,你如何指定自上次获胜以来已经存在多长时间?”的问题。我选择的默认值是np.nan,因为这对于未定义的数字。

请注意,在您的情况下,您要求在事件发生时继续增加隐含计数器:在您的奖金为50时,自上次获胜后为3步,而不是零。这很容易:只需将所有值向右移动一个索引,然后将它们增加一个。这可以通过像np.roll这样的函数来完成,但索引工作正常:

import numpy as np
# Uncomment this to extract the array from the pandas 
# dataframe as a numpy array (important for boolean indexing)
# wins = g.WINNINGS.values 

# Example array, slightly extended
wins = np.array([0, 1500, 0, 0, 50, 0, 20, 0, 0, 30, 2, 0, 0])
unknown_label = np.nan  # the label for indicating that you don't know how long ago an event occurred.
steps_ago = count_ago(wins, unknown_label)
adjusted = np.full_like(steps_ago, fill_value=unknown_label)
adjusted[1:] = steps_ago[:-1] + 1
# adjusted is: 
# np.array([np.nan, np.nan, 1., 2., 3., 1., 2., 1., 2., 3., 1., 1., 2.], dtype=float16)