分解当前熊猫df

时间:2019-09-19 02:08:32

标签: python pandas dataframe

我正在为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)    

出局:

     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 个答案:

答案 0 :(得分:2)

下面是我的解决方法并附带说明

步骤:

  • 获取唯一成员及其计数
  • 创建与成员长度相等的可用区号列表,以相反的顺序排序,以便弹出框给出最小的可用id
  • 跟踪分配给“区域”词典中成员的ID
  • 将ID分配给成员后成员的递减计数
  • 取消分配成员数为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)