Моя цель - разработать функцию, которая будет принимать два аргумента - один - список людей, играющих в покер, второй - список возможных действий (например, колл, рейз) - и использовать str.contains в столбце, чтобы узнать, как часто каждый игрок выполняет каждое действие.
DataFrame df
имеет несколько столбцов, но я хочу применить эту функцию только к столбцу с названием «запись», который состоит из журнала всех действий, которые произошли в стол для онлайн-покера (каждая строка в столбце представляет собой строку).
Вот как выглядит столбец «запись» (каждая строка представляет собой строку):
-- ending hand #174 --
"Prof @ ZY_G_5ZOve" gained 100
"tom_thumb @ g1PBaozt7k" folds
"Prof @ ZY_G_5ZOve" calls with 50
"tom_thumb @ g1PBaozt7k" checks
river: 9♦, 5♣, Q♥, 7♠[K♠]
"Prof @ ZY_G_5ZOve" checks
"tom_thumb @ g1PBaozt7k" checks
turn: 9♦, 5♣, Q♥ [7♠]
"Prof @ ZY_G_5ZOve" checks
"tom_thumb @ g1PBaozt7k" checks
flop: [9♦, 5♣, Q♥]
"Prof @ ZY_G_5ZOve" checks
"tom_thumb @ g1PBaozt7k" calls with 50
"Bob T. @ fjZTXUGV2G" folds
"danny G @ tNE1_lEFYv" folds
"Prof @ ZY_G_5ZOve" posts a big blind of 50
"tom_thumb @ g1PBaozt7k" posts a small blind of 25
-- starting hand #174 (Texas Hold'em) (dealer: "Bob T. @ fjZTXUGV2G") --
-- ending hand #173 --
"tom_thumb @ g1PBaozt7k" gained 475
"danny G @ tNE1_lEFYv" folds
"Prof @ ZY_G_5ZOve" folds
"tom_thumb @ g1PBaozt7k" raises with 356
flop: [4♥, A♠, 6♠]
"danny G @ tNE1_lEFYv" calls with 150
"Prof @ ZY_G_5ZOve" calls with 150
"tom_thumb @ g1PBaozt7k" raises with 150
"Bob T. @ fjZTXUGV2G" folds
"danny G @ tNE1_lEFYv" calls with 50
"Prof @ ZY_G_5ZOve" calls with 50
"tom_thumb @ g1PBaozt7k" posts a big blind of 50
"Bob T. @ fjZTXUGV2G" posts a small blind of 25
-- starting hand #173 (Texas Hold'em) (dealer: "danny G @ tNE1_lEFYv") --
Вот какой-то пример кода, который я пробовал:
player_list = ['danny G', 'Jane', 'Prof', 'spn', 'tim', 'Bob T.', 'joon', 'tom_thumb']
action_list = ['call', 'fold']
def action_amount(df, player_list, action):
for player in player_list:
action_number =len(df[df['entry'].str.contains('(player).*(action)', regex=True)])
print(f'{player} {action}ed {action_number} times.')
action_amount(df, player_list, 'call')
Прямо сейчас форматирование правильное, но я не могу l oop элементов в списке, чтобы str.contains, поэтому вот результат:
danny G called 0 times.
Jane called 0 times.
Prof called 0 times.
spn called 0 times.
tim called 0 times.
Bob T. called 0 times.
joon called 0 times.
tom_thumb called 0 times.
Для примера df['entry']
информации выше он должен вернуть:
danny G called 2 times.
Jane called 0 times.
Prof called 3 times.
spn called 0 times.
tim called 0 times.
Bob T. called 0 times.
joon called 0 times.
tom_thumb called 1 times.
Примечательно, что len(df[df['entry'].str.contains('(danny G).*(call)', regex=True)])
возвращает правильное значение (я использую регулярное выражение, потому что два слова, которые я ищу for находятся в одной строке с кучей разных символов Действует между ними).
Проблема, похоже, связана с попыткой l oop значений в строковый шаблон str.contains
. Как мне пройти oop по списку и напечатать имена вместе с количеством раз, когда человек выполнил заданное введенное действие?
В идеале, я бы хотел oop просмотреть оба списка в одновременно вверху кода.