亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 227 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號