Панды БЫСТРО извлекают данные в определенном порядке

#python #pandas

#python #pandas

Вопрос:

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

Все идентификаторы уникальны.

 import pandas as pd
import numpy as np

print('Generating table and matchTable...')

N = 10000
# General unique IDs list to draw from
ids = np.random.choice(a=list(range(N*100)), replace=False, size=N*10)

# First N ids go into MAIN_IDS
mainIDs = ids[:N]
data = np.random.randint(low=0, high=25, size=N)

table = pd.DataFrame({'MAIN_IDS': mainIDs, 'DATA':data})

# These ids exist in the table as MAIN_IDS
tableIdsList = np.random.choice(mainIDs, replace=False, size=int(N/10))
notInTableIdsList = ids[N:N int(N/10)]

idsA = np.zeros(shape=(int(N/10)), dtype=np.int)
idsB = np.zeros(shape=(int(N/10)), dtype=np.int)
for i in range(len(idsA)):
    if np.random.random()>0.4:
        idsA[i] = tableIdsList[i]
        idsB[i] = notInTableIdsList[i]
    else:
        idsA[i] = notInTableIdsList[i]
        idsB[i] = tableIdsList[i]

matchTable = pd.DataFrame({'ID1': idsA, 'ID2':idsB})
print('   Done!')

print('Generating the correct result...')
correctResult = []
for i in range(len(tableIdsList)):
    correctResult.append(data[np.where(mainIDs==tableIdsList[i])[0][0]])
correctResult = np.array(correctResult)
print('   Done!')
 

Я хочу получить ДАННЫЕ, где MAIN_ID== ID1 или ID2, но в порядке сопоставления.

Комментарии:

1. у вас есть два столбца в таблице соответствия, какой из них должен быть первым?

2. Это не имеет значения, в таблице присутствует только одно из двух значений столбца (либо ID1, либо ID2) (как MAIN_IDS). И какой из них присутствует, зависит от строки.

3. например, id1 = [1,2] id2 = [3,4], поэтому вы хотите отфильтровать [1,2,3,4] ?

4. похоже: for each row either ID1 or ID2 is in the table but not both сыграло бы роль.

5. @Wen-Ben Я понимаю, что вы имеете в виду, нет, это должно быть в порядке строк. Итак, если id1 =[1,2] и id2 = [3,4], но [1,4] присутствуют в MAIN_IDS, тогда [1,4] является фильтром.

Ответ №1:

Сначала отфильтруйте вашу таблицу совпадений по идентификатору из таблицы, затем мы используем reindex

 idx=matchTable.where(matchTable.isin(table.MAIN_IDS.tolist())).stack()

table=table.set_index('MAIN_IDS').reindex(idx).reset_index()
 

Комментарии:

1. Когда я выполняю matchTable.ID1.isin(table.MAIN_IDS).head(5) идентификаторы найдены, но когда я выполняю matchTable.isin(table.MAIN_IDS).head(5), все это ложно.

2. @user1581390 matchTable.isin(table.MAIN_IDS.tolist()).