根据groupby计数值更新数据框列

问题描述 投票:0回答:1

遇到障碍,因此询问更大的社区。

我有一个输入数据框,其中包含员工 ID 和部门 ID。

首先,我需要按 DeptID 的计数获取组。

然后我想聚合计数小于 10 的所有条目,并将 deptID 替换为前 3 个字母,并以

_merged
为后缀,并将它们添加到此合并的 DeptID 的计数中。

我能够完成上半场,但下半场遇到了障碍。

稍后我可能还需要对合并的部门 ID 计数应用硬性限制,即不超过 100。

输入数据框

EmpID     DeptID 

8959236   YTCD
8597697   YTCZ
9312115   YTCD
2931213   YTCQ
9312197   QCVZ
4912748   YKKC
5474785   QCIO
1575364   MLQD
1575878   PCJZ 
2915764   QCIO

按部门 ID 获取聚合计数:

agg_count_by_DeptID  = df.groupby("DeptID")["DeptID"].count()

agg_count_by_DeptID 熊猫系列:

YTCD   20
YTCZ    2    
YTCQ    4    
YTCL    1    
QCVZ   25 
YKKC   11
QCIO    6
MLQD    9
PCJZ    7
QCIK    2

输出逻辑

迭代熊猫系列,

  • 首先获取共享前 3 个部门 ID 字符的所有元素,例如 YTCD、YTCZ、YTCQ 和 YTCL
  • 按升序对它们进行排序(不是必需的,但最好有)
  • 然后检查计数,
    • 如果计数大于 10,则保留它。
    • 如果计数小于 10,则替换为
      FIRST-3-CHARS_merged
  • 最后用新的 deptID 更新输入数据框

预期输出pandas系列:

YTCD   20
YTC_merged 7    
QCVZ   25 
YKKC   11
QCI_merged  8    
MLQ_merged    9
PCJ_merged    7

注意:YTCZ、YTCQ 和 YTCL 的计数如何合计为

YTC_merged
,因为它们都小于 10,而
YTCD
保持原样

输出数据帧

EmpID     DeptID 

8959236   YTCD
8597697   YTC_merged
9312115   YTCD
2931213   YTC_merged
9312197   QCVZ
4912748   YKKC
5474785   QCI_merged
1575364   MLQ_merged
1575878   PCJ_merged 
2915764   QCI_merged
python pandas dataframe group-by
1个回答
0
投票

代码

thresh = 1 # you can change thresh to 10
cond = df.groupby('DeptID')['EmpID'].transform('count') > thresh
df['DeptID'] = df['DeptID'].where(cond, df['DeptID'].str[:3] + '_merged')

df

     EmpID      DeptID
0  8959236        YTCD
1  8597697  YTC_merged
2  9312115        YTCD
3  2931213  YTC_merged
4  9312197  QCV_merged
5  4912748  YKK_merged
6  5474785        QCIO
7  1575364  MLQ_merged
8  1575878  PCJ_merged
9  2915764        QCIO
© www.soinside.com 2019 - 2024. All rights reserved.