有没有办法根据数据帧中前一列之间的关系来创建列?

2024-09-26 18:03:10 发布

您现在位置:Python中文网/ 问答频道 /正文

给定:我有熊猫数据帧,如下所示

| Employee_ID | Manager_ID |
|:-----------:|:----------:|
| E068        | E067       |
| E071        | E067       |
| E229        | E069       |
| E248        | E144       |
| E226        | E223       |
| E236        | E241       |
| E066        | E001       |
| E067        | E001       |
| E144        | E001       |
| E223        | E001       |
| E069        | E066       |

问题陈述:

这个问题是通过使用员工和他们的经理数据来识别经理的领导。你知道吗

关于:

我们有一个Employee ID和它们的Manager ID。请注意,Manager ID来自Employee ID。因为每个经理都有一个高于他们级别的经理。你知道吗

步骤:

  1. 首先,我们将获取Manager ID列中的所有唯一ID。你知道吗
  2. 然后对于Manager ID列中的每个ID,我们将查找它们各自的Manager ID(Manager)
  3. 然后我们将创建一个新的列,比如Level 1,我们将把每个Manager ID的管理器放在它们各自的单元格上。你知道吗
  4. 类似地,我们将再次重复上述3个过程,直到该特定ID没有Manager ID
  5. 这样我们就可以识别Head of Manager。你知道吗

我能用EXCEL解决这个问题。 通过使用=IFERROR(VLOOKUP(C2,$A:$B,2,FALSE),"")

但这种方法使我在excel中为每个层次结构创建新的列。将公式放在特定列的第一个单元格上,然后拖动每个管理器的结果

但如果是大公司,则会有n个等级。因此,在excel中为每个层次结构创建新列将是一项耗时的任务。因此,我正在寻找一个最佳的解决方案。你知道吗

预期产量:

| Employee ID | Manager ID | Level 1 | Level 2 | Head of Manager |
|:-----------:|:----------:|---------|---------|-----------------|
| E068        | E067       | E001    |         | E001            |
| E071        | E067       | E001    |         | E001            |
| E229        | E069       | E066    | E001    | E001            |
| E248        | E144       | E001    |         | E001            |
| E226        | E223       | E001    |         | E001            |
| E236        | E241       |         |         | E241            |
| E066        | E001       |         |         | E001            |
| E067        | E001       |         |         | E001            |
| E144        | E001       |         |         | E001            |
| E223        | E001       |         |         | E001            |

The Employee ID column contain UNIQUE ID while Manager ID contain DUPLICATES ID.

谢谢你的时间和考虑。你知道吗


Tags: 数据idemployeemanagerlevel经理e001e223
1条回答
网友
1楼 · 发布于 2024-09-26 18:03:10

我们可以使用^{},循环在没有充满NaN值的列时执行。使用^{}^{}^{}检查:

i=1
df['Level 0']=df['Manager_ID']
while df.notna().any().all():
    df[f'Level {i}']=df[f'Level {i-1}'].map(df.set_index('Employee_ID')['Manager_ID'])
    i+=1

df=df.rename(columns={f'Level {i-1}':'Header of Manager'}).drop('Level 0',axis=1)
df['Header of Manager']=df[f'Level {i-2}'].bfill().ffill()

print(df)

输出:

   Employee_ID Manager_ID Level 1 Level 2 Header of Manager
0         E068       E067    E001     NaN              E001
1         E071       E067    E001     NaN              E001
2         E229       E069    E066    E001              E001
3         E248       E144    E001     NaN              E001
4         E226       E223    E001     NaN              E001
5         E236       E241     NaN     NaN              E001
6         E066       E001     NaN     NaN              E001
7         E067       E001     NaN     NaN              E001
8         E144       E001     NaN     NaN              E001
9         E223       E001     NaN     NaN              E001
10        E069       E066    E001     NaN              E001

我们可以这样简化:

i=1
df['Level 0']=df['Manager_ID']
while df.notna().sum().ne(1).all():
    df[f'Level {i}']=df[f'Level {i-1}'].map(df.set_index('Employee_ID')['Manager_ID'])
    i+=1
df=df.drop('Level 0',axis=1)
df['Header of Manager']=df.loc[:,f'Level {i-1}'].ffill().bfill()

相关问题 更多 >

    热门问题