Добавление значений в определенные строки и столбцы в pandas df

#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
 

Вы можете видеть, что содержит ту же информацию в меньшей матрице.