Замена значений в Pandas кадре данных - PullRequest
2 голосов
/ 27 апреля 2020

У меня есть датафрейм (с именем df) следующим образом:

    s01  s03  s06  s07  s08
0   1    1    1    1    1
1   1    1    1    1    1
2   0    1    1    0    1
3   0    0    1    1    0
4   0    0    0    1    1

Я хотел бы заменить все единицы на значение индекса.

Окончательный результат должен выглядеть следующим образом:

    s01  s03  s06  s07  s08
0   0    0    0    0    0
1   1    1    1    1    1
2   0    2    2    0    2
3   0    0    3    3    0
4   0    0    0    4    4

Это всего лишь образец. Реальный фрейм данных имеет тысячи строк и тысячи столбцов. Приоритет состоит в том, чтобы иметь эффективный код, который изменяет данные как можно быстрее.

Я подумал о трех возможных способах решения этой проблемы:

  • Использование 2 'для операторы 'loops and a' if 'и l oop непосредственно над объектом panda или преобразование данных в двумерный массив numpy с циклическим повторением.

  • Использование некоторого вида pandas встроенная функция фильтрации для pandas фрейма данных.

  • Преобразование фрейма данных в двумерный массив Numpy и использование некоторой встроенной функции numpy для измените данные.

Какой самый эффективный способ?

Есть ли другой способ, который более эффективен, и я об этом не подумал?

Спасибо

1 Ответ

5 голосов
/ 27 апреля 2020

Вы можете сделать с mask:

df.mask(df.eq(1), df.index)

Вывод:

   s01  s03  s06  s07  s08
0    0    0    0    0    0
1    1    1    1    1    1
2    0    2    2    0    2
3    0    0    3    3    0
4    0    0    0    4    4

Если ваш индекс числовой, как в этом примере, вы также можете сделать:

df.mul(df.index, axis=0)
...