Python 将当前的唯一值分解为

Python 将当前的唯一值分解为,python,pandas,dataframe,Python,Pandas,Dataframe,我正在将一个整数分配给df中的各个组。我目前正在为此使用pd.factorize。然而,我希望只考虑当前值 例如,使用下面的df,一个唯一的整数被分配给成员。这将基于出现的每个唯一值进行累加。但我希望只考虑当前的价值。与中一样,如果成员中的值没有再次出现,则将该整数指定给成员中的下一个新值。由于C2不再出现在df中,我想将该整数传递给成员中的下一个唯一值 df = pd.DataFrame({ 'Period' :

我正在将一个整数分配给
df
中的各个组。我目前正在为此使用
pd.factorize
。然而,我希望只考虑当前值

例如,使用下面的
df
,一个唯一的整数被分配给
成员
。这将基于出现的每个唯一值进行累加。但我希望只考虑当前的价值。与中一样,如果
成员
中的值没有再次出现,则将该整数指定给
成员
中的下一个新值。由于C2不再出现在df中,我想将该整数传递给
成员中的下一个唯一值

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)    
输出:

预期:

   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
都出现在以下时段

下面是我的解决方案,并进行了解释

步骤:

  • 获取唯一成员及其计数
  • 创建等于成员长度的可用区号列表,按相反顺序排序,以便poping提供最小可用id
  • 在“区域”字典中跟踪分配给成员的ID
  • 将id分配给成员时成员的递减计数
  • 当成员计数为0时,取消分配分配给成员的区域,并将其添加到可用区域,以便可以将其重新用于新成员
注意:这与您解释的逻辑一致,但给出的结果与上面显示的不同

将熊猫作为pd导入
df=pd.DataFrame({
“期间”:[1,1,1,2,2,2,2,3,3,3,3,3],
‘成员’:[‘C1’、‘C2’、‘C4’、‘C1’、‘C2’、‘C3’、‘C4’、‘C1’、‘C3’、‘C4’、‘C5’],
})
def分配_区域(df):
members,counts=pd.np.unique(df.Member,return\u counts=True)
成员计数=dict(zip(成员计数))
面积={}
可用面积=列表(范围(长度(成员),0,-1))
面积_col=[]
对于df中的成员。成员:
如果成员在以下领域:
面积=面积[成员]
其他:
面积=可用面积。pop()
面积[成员]=面积
区域列附加(区域)
成员计数[成员]-=1
如果成员_计数[成员]==0:
可用面积。附加(面积)
可用面积。排序(反向=真)
df[“面积”]=面积
返回df
分配区域(df)

下面是我的解决方案,并给出了解释

步骤:

  • 获取唯一成员及其计数
  • 创建等于成员长度的可用区号列表,按相反顺序排序,以便poping提供最小可用id
  • 在“区域”字典中跟踪分配给成员的ID
  • 将id分配给成员时成员的递减计数
  • 当成员计数为0时,取消分配分配给成员的区域,并将其添加到可用区域,以便可以将其重新用于新成员
注意:这与您解释的逻辑一致,但给出的结果与上面显示的不同

将熊猫作为pd导入
df=pd.DataFrame({
“期间”:[1,1,1,2,2,2,2,3,3,3,3,3],
‘成员’:[‘C1’、‘C2’、‘C4’、‘C1’、‘C2’、‘C3’、‘C4’、‘C1’、‘C3’、‘C4’、‘C5’],
})
def分配_区域(df):
members,counts=pd.np.unique(df.Member,return\u counts=True)
成员计数=dict(zip(成员计数))
面积={}
可用面积=列表(范围(长度(成员),0,-1))
面积_col=[]
对于df中的成员。成员:
如果成员在以下领域:
面积=面积[成员]
其他:
面积=可用面积。pop()
面积[成员]=面积
区域列附加(区域)
成员计数[成员]-=1
如果成员_计数[成员]==0:
可用面积。附加(面积)
可用面积。排序(反向=真)
df[“面积”]=面积
返回df
分配区域(df)

为什么C3是2?在第2Yeh段中,我将对此进行补充。因为
C2
不再出现,
C3
应该接管分配的值。这就好像
C2
完成,而
C3
正在同时接管。组合在这里行吗。在一组嵌套的字符串中<代码>C2,C3
为什么C3是2?在第2Yeh段中,我将对此进行补充。因为
C2
不再出现,
C3
应该接管分配的值。这就好像
C2
完成,而
C3
正在同时接管。组合在这里行吗。在一组嵌套的字符串中<代码>C2、C3
   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