#python #python-3.x #pandas #dataframe #nested
#python #python-3.x #pandas #фрейм данных #вложенный
Вопрос:
Я пытаюсь добавить значения в фрейм данных pandas на основе входных данных пользователя и агента. Это пример, над которым я работаю до сих пор.
import numpy as np
import pandas as pd
import random
ls = np.zeros((9,3))
choices = ['R','P','S']
df = pd.DataFrame(ls, columns=['R','P','S'], index = ['RR','RP','RS','PR','PP','PS','SR','SP','SS'])
for _ in range(100):
user_choice = random.choice(choices)
agent_choice = random.choice(choices)
#print(user_choice,agent_choice)
for _ in range(len(df)):
for _ in range(len(df['R'])):
df[user_choice agent_choice][agent_choice] = 1
Желаемый результат будет выглядеть примерно так:
Любая помощь будет высоко оценена
Ответ №1:
Не уверен, что это действительно то, что вы хотите, но Python, NumPy и Pandas предоставляют некоторые приятные удобства для выполнения этих задач:
>>> import random
>>> import numpy as np, pandas as pd
>>> from itertools import product
>>> choices = 'RPS'
>>> df = pd.DataFrame(np.zeros((9,3)), columns=list(choices), index=[''.join(l) for l in product(choices, repeat=2)])
>>> user_choices = np.array([random.choice(choices) for _ in range(100)], dtype=str)
>>> agent_choices = np.array([random.choice(choices) for _ in range(100)], dtype=str)
for ac, cc in zip(agent_choices, np.char.add(user_choices, agent_choices)):
... if ac == cc[-1]:
... df[ac][cc] = 1
...
>>> df
R P S
RR 14.0 0.0 0.0
RP 0.0 14.0 0.0
RS 0.0 0.0 7.0
PR 11.0 0.0 0.0
PP 0.0 13.0 0.0
PS 0.0 0.0 8.0
SR 10.0 0.0 0.0
SP 0.0 8.0 0.0
SS 0.0 0.0 15.0
Поскольку вы, похоже, хотите, чтобы оно было нормализовано до процента:
>>> df / 100
R P S
RR 0.14 0.00 0.00
RP 0.00 0.14 0.00
RS 0.00 0.00 0.07
PR 0.11 0.00 0.00
PP 0.00 0.13 0.00
PS 0.00 0.00 0.08
SR 0.10 0.00 0.00
SP 0.00 0.08 0.00
SS 0.00 0.00 0.15
Очевидная проблема заключается в том, что это всегда даст вам разреженную матрицу. Вы хотите подсчитать (user_choice, agent_choice) с помощью agent_choice, тогда единственными ячейками, которые когда-либо могут быть заполнены, являются те, где второй символ индекса совпадает с символом заголовка столбца. Вы также можете просто свернуть это, чтобы просто сделать индекс и заголовок столбца [‘R’, ‘P’, ‘S’] и подсчитать, сколько раз пользователь выбирал ‘R’, когда агент выбирал ‘R’ и т.д.
>>> df = pd.DataFrame(np.zeros((3,3)), columns=list(choices), index=list(choices))
>>> for a, c in zip(agent_choices, user_choices):
... df[a][c] = 1
...
>>> df
R P S
R 14.0 14.0 7.0
P 11.0 13.0 8.0
S 10.0 8.0 15.0
>>> df / 100
R P S
R 0.14 0.14 0.07
P 0.11 0.13 0.08
S 0.10 0.08 0.15
Вы можете видеть, что содержит ту же информацию в меньшей матрице.