Я хотел бы заполнить пустой фрейм данных, используя последовательность конкретных пар меток индекса / столбца.
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