3 回答
TA贡献1783条经验 获得超4个赞
IIUC 您正在寻找cumcount:
df["count"] = df.groupby(['Building ID', 'Assessment Phase']).cumcount()+1
print (df)
Building ID Assessment Phase count
0 1 Phase 1 1
1 2 Phase 2 1
2 2 Phase 2 2
3 3 Phase 3 1
4 3 Phase 3 2
5 3 Phase 3 3
6 4 Unk 1
7 4 Phase 1 1
8 5 Phase 2 1
TA贡献1803条经验 获得超6个赞
首先,创建数据框:
from io import StringIO
import pandas as pd
data = ''' Building ID Assessment Phase
001 Phase 1
002 Phase 2
002 Phase 2
003 Phase 3
003 Phase 2
003 Phase 3
004 Unk
004 Phase 1
005 Phase 2
df = pd.read_csv(StringIO(data), sep='\s\s+', engine='python')
'''
其次,创建一个名为“计数器”的辅助列(0 表示未知评估阶段,否则为 1):
df['counter'] = 1
mask = df['Assessment Phase'] == 'Unk'
df.loc[mask, 'counter'] = 0
第三,按建筑物ID分组,并将cumsum(累积和)函数应用于计数器列。然后手动更新“未知”行。
df['Bldg_Phs_Ord'] = df.groupby('Building ID')['counter'].cumsum()
df.loc[mask, 'Bldg_Phs_Ord'] = 1
print(df)
Building ID Assessment Phase counter Bldg_Phs_Ord
0 1 Phase 1 1 1
1 2 Phase 2 1 1
2 2 Phase 2 1 2
3 3 Phase 3 1 1
4 3 Phase 2 1 2
5 3 Phase 3 1 3
6 4 Unk 0 1
7 4 Phase 1 1 1
8 5 Phase 2 1 1
我不知道如何避免对“Unk”评估阶段的特殊处理。并且cumsum()对数据框的初始顺序敏感。
TA贡献1784条经验 获得超8个赞
假设df
是您的输入数据框,请尝试:
df['COUNT'] = df.groupby(['Building ID', 'Assessment Phase']).cumcount().add(1)
cumcount
不会减少行数。
添加回答
举报