#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()).