为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

POPMUISE 2023-04-18 15:32:07
我有一个包含 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我应该添加什么以便它返回每个单独的累积行数?
查看完整描述

3 回答

?
慕娘9325324

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


查看完整回答
反对 回复 2023-04-18
?
慕码人8056858

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()对数据框的初始顺序敏感。


查看完整回答
反对 回复 2023-04-18
?
青春有我

TA贡献1784条经验 获得超8个赞

假设df是您的输入数据框,请尝试:

df['COUNT'] = df.groupby(['Building ID', 'Assessment Phase']).cumcount().add(1)

cumcount不会减少行数。


查看完整回答
反对 回复 2023-04-18
  • 3 回答
  • 0 关注
  • 114 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信