После выполнения анализа я пытаюсь упростить количество значений в данном поле («SRU»), сопоставляя их из другого поля («NewBook») с новым столбцом во фрейме данных. Мне нужно сохранить существующую схему поля «SRU».
Учитывая приведенный ниже кадр данных, как я могу выполнить итерацию по значениям "CYCLE" (всего 63 уникальных значения), а затем отобразить существующее "SRU" (до 14 уникальных значений, в зависимости от CYCLE) значение с учетом его значения для "NewBook" (в зависимости от CYCLE может быть до 5 уникальных значений)?
SRU NewBook CYCLE
STL19203 1 1
STL19203 1 1
STL19203 1 1
STL24203 1 2
STL24203 1 2
STL38203 1 3
STL44203 1 4
STL44203 1 4
Ниже приведен ожидаемый результат. Я добавил некоторые изменения в «NewBook», чтобы лучше представить, что мне нужно. Обратите внимание, что для вновь сопоставленного столбца не имеет значения, какие существующие блоки SRU используются для какого цикла, если они согласованы на протяжении всего цикла.
SRU NewBook CYCLE OptimalSRU
STL19203 1 1 STL19203
STL14203 2 1 STL14203
STL16203 3 1 STL16203
STL24203 1 2 STL24203
STL25203 2 2 STL25203
STL38203 1 3 STL38203
STL44203 1 4 STL44203
STL49503 2 4 STL49503
Моей первой мыслью было использование функции pd.map()
от panda, но у меня возникли проблемы с концепцией, как перебирать группы / уникальные значения и компилировать словарь, который я использовал бы для сопоставления нового столбца. Все примеры, с которыми я сталкиваюсь онлайн, являются единичными примерами (создание фиктивных переменных), используют два отдельных dfs или не применяют функцию, основанную на уникальных значениях.
Ниже приведено то, что я имею до сих пор ... Я пытаюсь отфильтровать для каждого цикла, взять длину уникальных значений "NewBook", а затем скомпилировать в словарь для pd.map()
.
# collect unique values from column
listCycleValues = df3.CYCLE.unique()
# loop through each element in the list
for x in listCycleValues:
# filter for the cycle element
dfFiltered = df3.loc[df3['CYCLE'] == x]
# collect all of the SRUs and NewBook for the subset
listUniqueSRU = dfFiltered['SRU'].unique()
listUniqueOptBook = dfFiltered['NewBook'].unique()
print('Cycle {} has {} unique SRUs and {} new books'.format(x, len(listUniqueSRU), len(listUniqueOptBook)))
# trouble starts here...
# create a dictionary with the SRUs and book for mapping
# like this {1: STL22210 , 2: STL22203 }
for y in range(len(listUniqueOptBook)):
dictForMap = dict([(listUniqueOptBook[y], listUniqueSRU[y])])
# not sure how looping impacts the expected result
df3['OptimalSRU'] = dfFiltered['NewBook'].map(dictForMap)