我正在为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
全部出现在以下期间
答案 0 :(得分:2)
下面是我的解决方法并附带说明
步骤:
注意:这是根据您解释的逻辑,但给出的结果与上面显示的不同
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)