Python Pandas 是否有办法指定一个列来计算值组合的每次出现?

我有一个包含 22 列的 Pandas 数据框,用于处理建筑评估,但是,我只关注两个特定的列。这两列是数字建筑物 ID 和评估阶段,指示相应建筑物 ID 处于哪个阶段。基本上,我想做的是计算这两列中值组合的出现次数,并将这些计数存储在序数列。详情如下:


  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

您会注意到有重复的 ID 和看起来相同的评估。我想要按建筑物 ID 和评估阶段分组的每个类似事件的累积行数。它应该看起来像这样:


  Building ID   | Assessment Phase | Bldg_Phs_Ord

--------------------------------------------------

  001                Phase 1              1

  002                Phase 2              1

  002                Phase 2              2

  003                Phase 3              1

  003                Phase 3              2

  003                Phase 3              3

  004                  Unk                1         

  004                Phase 1              1

  005                Phase 2              1

可以看出,每个组合都有单独的计数。一些组合重复几次,其中每个后续组合都放在自己的行中。


我尝试过的是测试它是否正确输出:


test_cnt = bldg_df.groupby(['Building ID', 'Assessment Phase']).size().to_frame('COUNT').sort_values(by=['Building ID']).reset_index()

不幸的是,只要存在不止一个重复组合,这就会将这些组合聚合在一起。


     Building ID   | Assessment Phase | COUNT

--------------------------------------------------

  001                Phase 1              1

  002                Phase 2              2

  003                Phase 3              3

  004                  Unk                1         

  004                Phase 1              1

  005                Phase 2              1

我应该添加什么以便它返回每个单独的累积行数?


POPMUISE
浏览 115回答 3
3回答

慕娘9325324

IIUC 您正在寻找cumcount:df["count"] = df.groupby(['Building ID', 'Assessment Phase']).cumcount()+1print (df)   Building ID Assessment Phase  count0            1          Phase 1      11            2          Phase 2      12            2          Phase 2      23            3          Phase 3      14            3          Phase 3      25            3          Phase 3      36            4              Unk      17            4          Phase 1      18            5          Phase 2      1

慕码人8056858

首先,创建数据框:from io import StringIOimport pandas as pddata = '''  Building ID    Assessment Phase001                Phase 1002                Phase 2002                Phase 2003                Phase 3003                Phase 2003                Phase 3004                  Unk004                Phase 1005                Phase 2df = pd.read_csv(StringIO(data), sep='\s\s+', engine='python')'''其次,创建一个名为“计数器”的辅助列(0 表示未知评估阶段,否则为 1):df['counter'] = 1mask = 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'] = 1print(df)   Building ID Assessment Phase  counter  Bldg_Phs_Ord0            1          Phase 1        1             11            2          Phase 2        1             12            2          Phase 2        1             23            3          Phase 3        1             14            3          Phase 2        1             25            3          Phase 3        1             36            4              Unk        0             17            4          Phase 1        1             18            5          Phase 2        1             1我不知道如何避免对“Unk”评估阶段的特殊处理。并且cumsum()对数据框的初始顺序敏感。

青春有我

假设df是您的输入数据框,请尝试:df['COUNT'] = df.groupby(['Building ID', 'Assessment Phase']).cumcount().add(1)cumcount不会减少行数。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python