Как я могу изменить несколько значений одновременно в pandas dataframe, используя массивы в качестве индексов, которые различаются по длине? - PullRequest
2 голосов
/ 03 мая 2019

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

Мне нужно что-то более быстрое, чем цикл for, потому что это будетдолжно быть сделано для большого количества строк, и это оказалось слишком медленным.

В качестве простого примера рассмотрим это

df = pd.DataFrame(np.zeros((5,5)))

Теперь я хочу изменить некоторые значения вэтот кадр данных равен 1. Если я, например, хочу изменить значения во второй и пятой строке для первых двух столбцов, но в четвертой строке я хочу изменить все значения, я хочу, чтобы что-то вроде этого работало:

col_indices = np.array([np.arange(2),np.arange(5),np.arange(2)]) 


row_indices = np.array([1,3,4]) 


df.loc(row_indices,col_indices) =1

Однако это не работает (я подозреваю, что это не работает, потому что форма данных, которые вы выбираете, не соответствует фрейму данных).

Есть ли более гибкий способ индексациибез необходимости зацикливания строк и т. д .?

Решение, которое работает только для массивов, подобных диапазону (как указано выше), также будет работать для моей текущей проблемы, но общий ответ также будет хорошим.

Спасибо за любую помощь!

1 Ответ

1 голос
/ 03 мая 2019

IIUC вот один подход. Определите индексы столбцов как количество столбцов, в которые вы хотите вставить 1s вместо строк, в которые вы хотите вставить их:

col_indices = np.array([2,5,2])
row_indices = np.array([1,3,4]) 
arr = df.values

И используйте расширенное индексирование , чтобы установить интересующие ячейки на 1:

arr[row_indices] = np.arange(arr.shape[0]) <= col_indices[:,None]

array([[0., 0., 0., 0., 0.],
       [1., 1., 0., 0., 0.],
       [0., 0., 0., 0., 0.],
       [1., 1., 1., 1., 1.],
       [1., 1., 0., 0., 0.]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...