Как установить значение нескольких местоположений за одну итерацию в df.at - PullRequest
0 голосов
/ 31 мая 2018

У меня есть такой фрейм данных,

   a   b   c
0  1   6  11
1  2   7  12
2  3   8  13
3  4   9  14
4  5  10  15

, и другой фрейм данных выглядит следующим образом:

  column  index
0      a      0
1      b      2
2      c      4

во втором фрейме данных он содержит индекс и столбец, из этого файла я хочучтобы получить доступ к первому df и заменить это значение [row, column] на 1996.

Я пробовал это,

df.at[df_index['index'],df_index['column']]=1996

      a     b     c
0  1996  1996  1996
1     2     7    12
2  1996  1996  1996
3     4     9    14
4  1996  1996  1996

Но не работает должным образом,

Работает, когдаЯ пытался так,

for v in df_index.values:
    df.at[v[1],v[0]]=1996

      a     b     c
0  1996     6    11
1     2     7    12
2     3  1996    13
3     4     9    14
4     5    10  1996

Вопрос:

  1. почему моя первая попытка не удалась

  2. каков минимальный способчтобы достичь этого питонским способом.

1 Ответ

0 голосов
/ 31 мая 2018

pd.DataFrame.at и pd.DataFrame.iat используются для доступа и установки скалярных значений.Следовательно, вам нужно перебирать каждую комбинацию меток (строки, столбцы), чтобы установить значения с помощью этих методов.Вы не можете подавать серии или массивы в эти индексаторы.

Одна из возможностей - извлечь представление массива numpy, использовать векторизованное индексирование для обновления массива, а затем передать в pd.DataFrame:

vals = df.values
cols = df.columns.get_loc

vals[df_index['index'], df_index['column'].map(cols)] = 1996

res = pd.DataFrame(vals, index=df.index, columns=df.columns)

print(res)

      a     b     c
0  1996     6    11
1     2     7    12
2     3  1996    13
3     4     9    14
4     5    10  1996
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...