在Pandas Dataframe中删除整个列表行——如果列表包含元素(在本例中为一张或两张卡片)



第一次发布,并且刚刚使用Python整整29天-我遇到的大多数问题之前已经讨论过了-但是咬的方式超出了我的咀嚼能力…希望你们中有人能帮上忙。-应该添加的代码不是我的,只是搞砸它。

对于德州扑克来说,这是一个复杂的卡片排名方法,它使用Dataframe来排列所有可能的手牌(2,598,960),并给出手/锅值等(不重要),但你可以想象它是缓慢的。不能用它来玩纸牌游戏。

我试图删除所有潜在的手,不包括两张牌之前处理的翻牌(虽然我相信这将需要更长的时间)。在翻牌之后,代码遍历它们,对手牌进行排序。

我无法解决这个问题&我几乎100%肯定这个问题在谷歌上找不到答案。至少不能基于一个(或两个)元素删除列表行:

这是一个列表(从一个Panda Dataframe -打印)。

hand    value
0   [D2, C2, D3, D4, D5]  17.0543
1   [D2, C2, D3, D4, C5]  17.0543
2   [D2, C2, D3, C4, D5]  17.0543
3   [D2, C2, D3, C4, C5]  17.0543
4   [D2, C2, C3, D4, D5]  17.0543
5   [D2, C2, C3, D4, C5]  17.0543
6   [D2, C2, C3, C4, D5]  17.0543
7   [D2, C2, C3, C4, C5]  17.0543
8   [D2, D3, C3, D4, D5]  18.0542

不确定这是否有帮助,但为了清晰起见,我提供了一些代码(和注释)....尽量不要像我一样在上面浪费时间:)

我恐怕是尽可能地接近最小的可复制性了!

import pandas as pd
from scores import combinations, combi, score_hand, hand_values, df
import numpy as np
import itertools
def build_deck():
numbers=list(range(2,6))
suits = ['D','C']
deck = []
for i in numbers:
for s in suits:
card = s+str(i)
deck.append(card)
return deck
def combinations(arr, n):
arr = np.asarray(arr)
t = np.dtype([('', arr.dtype)]*n)
result = np.fromiter(itertools.combinations(arr, n), t)
return result.view(arr.dtype).reshape(-1, n)
def check_two_pair(hand,letters,numbers,rnum,rlet):
pairs = []
cards = []
for i in numbers:
if numbers.count(i) == 2:
pairs.append(i)
elif numbers.count(i) == 1:
cards.append(i)
cards = sorted(cards,reverse=True)
score = 30 + max(pairs) + min(pairs)/100 + cards[0]/1000
return score
def check_pair(hand,letters,numbers,rnum,rlet):    
pair = []
cards  = []
for i in numbers:
if numbers.count(i) == 2:
pair.append(i)
elif numbers.count(i) == 1:    
cards.append(i)
cards = sorted(cards,reverse=True)
score = 15 + pair[0] + cards[0]/100 + cards[1]/1000 + cards[2]/10000
return score
def score_hand(hand):
letters = [hand[i][:1] for i in range(5)] # We get the suit for each card in the hand
numbers = [int(hand[i][1:]) for i in range(5)]  # We get the number for each card in the hand
rnum = [numbers.count(i) for i in numbers]  # We count repetitions for each number
rlet = [letters.count(i) for i in letters]  # We count repetitions for each letter
dif = max(numbers) - min(numbers) # The difference between the greater and smaller number in the hand
handtype = ''
score = 0
if 5 in rlet:
if rnum.count(2) == 4:
handtype = 'two pair'
score = check_two_pair(hand,letters,numbers,rnum,rlet)
elif rnum.count(2) == 2:
handtype = 'pair'
score = check_pair(hand,letters,numbers,rnum,rlet)
elif rnum.count(2) == 4:
handtype = 'two pair'
score = check_two_pair(hand,letters,numbers,rnum,rlet) 
elif rnum.count(2) == 2:
handtype = 'pair'
score = check_pair(hand,letters,numbers,rnum,rlet)
else:
handtype= 'high card'
n = sorted(numbers,reverse=True)
score = n[0] + n[1]/100 + n[2]/1000 + n[3]/10000 + n[4]/100000
# print('this hand is a %s:, with score: %s' % (handtype,score))
return score

def handvalues(combinations):
scores =[{"hand": i, "value": score_hand(i)} for i in combi] # We iterate over all combinations scoring them # THATS THE TIME SAVING BIT THERE
scores = sorted(scores, key = lambda k: k['value']) # We sort hands by score
return scores

deck = build_deck() # We create our deck
combi = combinations(deck,5) # We create an array containing all possible 5 cards combinations
hand_values = handvalues(combi)
x = [i.get("hand","") for i in hand_values] # making a list of hands
y = [i.get("value","") for i in hand_values] #making a list of values

data = {'hand':x, 'value':y} # making a dictionary of hands and values
df = pd.DataFrame(data) # making a pandas dataframe with hands and values

别担心,我会在这之后回去学习基础的!

感谢阅读

如果您只想获得不包含'C2'和'D5'的行,那么下面应该可以工作。你可以使用apply来迭代,然后只使用条件。我使用pd.Series将您的手数组转换为Series对象,因为它包含isin()方法,用于检查它是否包含'C2'和'D5'。

import pandas as pd
#Test data
data = {  
'hand':[['D2', 'C2', 'D3', 'D4', 'D5'],
['D2', 'C2', 'D3', 'D4', 'C5'],
['D2', 'C2', 'D3', 'C4', 'D5'],
['D2', 'C2', 'D3', 'C4', 'C5'],
['D2', 'C2', 'C3', 'D4', 'D5'],
['D2', 'C2', 'C3', 'D4', 'C5'],
['D2', 'C2', 'C3', 'C4', 'D5'],
['D2', 'C2', 'C3', 'C4', 'C5'],
['D2', 'D3', 'C3', 'D4', 'D5'],
['D2', 'DX', 'C3', 'D4', 'DN']],
'value' : [17.0543,17.0543,17.0543,17.0543,17.0543,17.0543,17.0543,17.0543,18.0542,18.0523]
}
df = pd.DataFrame(data)
#Solution(See from below)
mask = df['hand'].apply( lambda hand_arr: not pd.Series(hand_arr).isin(['C2','D5']).any())
df.loc[mask]

输出:

hand    value
9   [D2, DX, C3, D4, DN]    18.0523

最新更新