Панды, установить значение на основе последовательности пар индекс + столбец - PullRequest
0 голосов
/ 26 декабря 2018

Я хотел бы заполнить пустой фрейм данных, используя последовательность конкретных пар меток индекса / столбца.

In [3]: test = pd.DataFrame(np.zeros([6,6]), index=list('ABCDEF'), columns=list('ABCDEF'))

В numpy вы можете заполнить массив поточечно при предоставлении двух непересекающихся списков числовых индексов для двух осей.

In [4]: test.values[((0,1,2,3,4),(0,0,2,3,3))]=88
In [5]: test
Out[5]: 
      A    B     C     D    E    F
A  88.0  0.0   0.0   0.0  0.0  0.0
B  88.0  0.0   0.0   0.0  0.0  0.0
C   0.0  0.0  88.0   0.0  0.0  0.0
D   0.0  0.0   0.0  88.0  0.0  0.0
E   0.0  0.0   0.0  88.0  0.0  0.0
F   0.0  0.0   0.0   0.0  0.0  0.0

Однако та же запись в пандах возвращает подмножество кадра данных и заполняет весь квадрант.

In [7]: test.loc[('A','B','C','D','E'), ('A','A','B','C','C')]=88
In [8]: test # df.loc, df.iloc and df.at all return same result
Out[8]: 
      A     B     C    D    E    F
A  88.0  88.0  88.0  0.0  0.0  0.0
B  88.0  88.0  88.0  0.0  0.0  0.0
C  88.0  88.0  88.0  0.0  0.0  0.0
D  88.0  88.0  88.0  0.0  0.0  0.0
E  88.0  88.0  88.0  0.0  0.0  0.0
F   0.0   0.0   0.0  0.0  0.0  0.0

В настоящее время я перехожу с алфавитных на числовые индексы и использую доступ к элементарным элементам, но мне интересно, есть ли более ясное и четкое решение?

test.values[ [list(test.index).index(x) for x in ('A','B','C','D','E')],
         [list(test.columns).index(x) for x in ('A','A','B','C','C')]]=88

Ответы [ 2 ]

0 голосов
/ 26 декабря 2018

Другой способ - использовать изменение формы данных:

t1 = test.stack()

t1.loc[zip(('A','B','C','D','E'), ('A','A','B','C','C'))] = 88

t1.unstack()

Вывод:

      A     B     C    D    E    F
A  88.0   0.0   0.0  0.0  0.0  0.0
B  88.0   0.0   0.0  0.0  0.0  0.0
C   0.0  88.0   0.0  0.0  0.0  0.0
D   0.0   0.0  88.0  0.0  0.0  0.0
E   0.0   0.0  88.0  0.0  0.0  0.0
F   0.0   0.0   0.0  0.0  0.0  0.0
0 голосов
/ 26 декабря 2018

Я могу думать только о цикле здесь

for x , y in zip(('A','B','C','D','E'), ('A','A','B','C','C')):
    test.at[x, y] = 88 

test
Out[294]: 
      A     B     C    D    E    F
A  88.0   0.0   0.0  0.0  0.0  0.0
B  88.0   0.0   0.0  0.0  0.0  0.0
C   0.0  88.0   0.0  0.0  0.0  0.0
D   0.0   0.0  88.0  0.0  0.0  0.0
E   0.0   0.0  88.0  0.0  0.0  0.0
F   0.0   0.0   0.0  0.0  0.0  0.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...