Факторизовать текущие уникальные значения в pandas df - PullRequest
0 голосов
/ 19 сентября 2019

Я присваиваю целое число различным группам в pandas df.В настоящее время я использую pd.factorize для этого.Тем не менее, я надеюсь учесть только текущие значения.

Например, используя df ниже, уникальное целое число присваивается Member.Это накапливается на основе каждого уникального значения, которое появляется.Но я надеюсь учесть только текущие значения.Например, если значение в Member больше не появляется, присвойте это целое число следующему новому значению в Member.Поскольку C2 больше не появляется в df, я хочу передать это целое число следующему уникальному значению в Member.

df = pd.DataFrame({                                    
    'Period' : [1,1,1,2,2,2,3,3,3,3],                 
    'Member' : ['C1','C2','C4','C1','C2','C4','C1','C3','C4','C5'],                                                  
    })

df['Area'] = (pd.factorize(df['Member'])[0] + 1)    

Out:

     Period Member  Area
0   1       C1     1   
1   1       C2     2   
2   1       C4     3   
3   2       C1     1   
4   2       C2     2      
5   2       C4     3   
6   3       C1     1   
7   3       C3     4   
8   3       C4     3   
9   3       C5     5 

Предназначено:

   Period Member  Area
0  1       C1     1   
1  1       C2     2   
2  1       C4     3   
3  2       C1     1   
4  2       C2     2   
5  2       C4     3   
6  3       C1     1   
7  3       C3     2   
8  3       C4     3   
9  3       C5     4 

Этот вывод предполагает, что C1,C3,C4,C5 все появляются в следующие периоды

1 Ответ

2 голосов
/ 19 сентября 2019

Ниже мое решение с объяснением

Шаги:

  • получить уникальных участников и их количество
  • создать список доступных кодов регионов, равный длине членов,отсортировано в обратном порядке, так что всплывающее окно дает минимальный доступный идентификатор
  • отслеживание назначенных идентификаторов для члена в словаре "областей"
  • уменьшение количества элементов, когда идентификатор назначается для элемента
  • отмените присвоение области, назначенной участнику, когда число участников равно 0, и добавьте ее к доступным областям, чтобы ее можно было повторно использовать для нового члена

ПРИМЕЧАНИЕ : Этов соответствии с логикой, которую вы объяснили, но дает другой результат, который вы показали выше

import pandas as pd

df = pd.DataFrame({                                    
    'Period' : [1,1,1,2,2,2,2,3,3,3,3],                       
    'Member' : ['C1','C2','C4','C1','C2','C3','C4','C1','C3','C4','C5'],                                                
    })

def assign_area(df):
    members, counts = pd.np.unique(df.Member, return_counts=True)
    member_counts = dict(zip(members, counts))
    areas = {}
    available_areas = list(range(len(members), 0, -1))
    area_col = []
    for member in df.Member:
        if member in areas:
            area = areas[member]
        else:
            area = available_areas.pop()
            areas[member] = area

        area_col.append(area)
        member_counts[member] -=1
        if member_counts[member] == 0:
            available_areas.append(area)
            available_areas.sort(reverse=True)

    df["area"] = area_col
    return df

assign_area(df)

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