2016-11-17 3 views
1

私は統計的な背景から、プログラミングの世界に来て、Pythonにはかなり新しいです。私は最近、思慮深く簡単な仕事をしていましたが、コードに入れるのは難しいようでした。値が観測された回数はいくつですか? Python

私たちは手の番号(演奏された手の数)を1列として、2番目の列の勝利の金額を持っているとします。

データ。

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

最後の勝利が何回手に起こったかを示す追加の列を取得したいと思います。

DESIRED OUTPUT。

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

私がそれを達成し、私のポーカープロジェクトが生産的であることが証明されたら、私はポットを共有するかもしれません。 :D

+1

最初の入賞がインデックス4にあるときはどうなりますか? – JuniorCompressor

答えて

1

あなたの配列が大きくなり起動すると、アルゴリズムをベクトルに見たいと思うかもしれません。以下は、ベクトル化された解法です。これは、パンダが構築している数学的関数であるnumpy関数に依存します。

あなたは、鋸歯状の機能を説明しています:特定のインデックスでリセットしてインデックスを直線的に増加させます。そのため、リセットが発生するインデックスを探し、線形インデックスの配列を生成する必要があります。線形に増加する指数から階段状のプロファイルを減算します。これは、下のコードで生成され、stairという変数に割り当てられます。減算は後で行で実行され、ここではnanの値で記入する要素の数が前に付いています。これは、未定義の数値が意味を成すためです(ゲームの開始時には、最後に勝つ?)。

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]) 

linear = np.arange(wins.shape[0]) 
indices = np.nonzero(wins)[0] 
repeats = np.diff(indices) 
stair = np.repeat(linear[indices] - indices[0], np.hstack((repeats, wins.shape[0] - np.sum(repeats)))) 

g['last_victory'] = np.hstack((np.full(indices[0] + 1, np.nan), # prepend 
    (linear - stair + 1)[:-(indices[0] + 1)])) 
# result: 
# g['last_victory'].values == np.array([ np.nan, np.nan, 1., 2., 3., 1., 2., 1., 2., 3., 1., 1., 2.]) 
+0

最初は複雑ですが、より柔軟で拡張可能なソリューションです。ナル値は明らかに、この問題のゼロよりも適切です。 Oliverありがとう。 –

1

この簡単なソリューションは、あなたが求めるものを提供します。誰かがそれを改善する気があれば、私も満足しています:

res = [] 
count = 0 
for win in g['WINNINGS']: 
    if win == 0: 
     res.append(count) 
     count+=1 
    else: 
     res.append(count) 
     count = 1 
g['VICTORY_LAST']= res 

私はコードがむしろ自明であると思います。ご不明な点がありましたら、お尋ねください。

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 
関連する問題