Я думаю, что замедление наступает во вложенном списке isin внутри среза loc.Я попробовал другой подход, используя numpy и логический индекс, который, кажется, удваивает скорость.
Сначала настройте фрейм данных.Я не был уверен, сколько у вас было уникальных предметов, поэтому я выбрал 50. Я также не был уверен, сколько столбцов так произвольно выбрал 10000 столбцов и строк.
df = pd.DataFrame(np.random.randn(10000, 10000))
ID = np.random.randint(0,50,10000)
df['ID'] = ID
Затем я пытаюсь использовать в основном пустые массивы и избегатьвложенный список с использованием логического индекса.
# Create a numpy array from the ID columns
a_ID = np.array(df['ID'])
# use the numpy unique method to get a unique array
# a = np.unique(np.array(df['ID']))
a = np.unique(a_ID)
# shuffle the unique array
np.random.seed(100)
np.random.shuffle(a)
# cut the shuffled array in half
X1 = a[0:25]
# create a boolean mask
mask = np.isin(a_ID, X1)
# set the index to the mask
df.index = mask
df.loc[True]
Когда я запускал ваш код на моем образце df, времена были 817 мс, код выше работает на 445 мс.
Не уверен, если этопомогает.Хороший вопрос, спасибо.