一行的多个结果

2024-10-06 11:24:39 发布

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

我有一个包含姓名和部门的数据框。所有这些名称可以映射到4个不同的部门(部门A、B、C和D)。例如,每个名称必须映射到部门A、B、C、D。在初始数据中,每个名称仅映射到一个部门。在最终的数据集中,每个名称映射到四个不同的部门。 我需要一种方法来为每个名称插入3个额外的行,并为它们添加3个其他部门

例如:

初始数据:

Name Department
Joe  A
Ellen A
Zach  A

最终数据:

Name Department
Joe  A
Joe  B
Joe  C
Joe  D
Ellen A
Ellen B
Ellen C
Ellen D
Zach  A
Zach  B
Zach  C
Zach  D

我知道这可以在某种形式的for循环中完成,但我对熊猫非常陌生,任何帮助都将非常感谢


Tags: 数据方法name名称for形式部门department
3条回答

您可以尝试将所有部门作为列表分配给每个名称,然后.explode

df = df.assign(Department=[["A", "B", "C", "D"]] * len(df)).explode(
    "Department"
)
print(df)

印刷品:

    Name Department
0    Joe          A
0    Joe          B
0    Joe          C
0    Joe          D
1  Ellen          A
1  Ellen          B
1  Ellen          C
1  Ellen          D
2   Zach          A
2   Zach          B
2   Zach          C
2   Zach          D

假设只需要product个值^{}pandas函数的开销小得多:

from itertools import product

import pandas as pd

df = pd.DataFrame({'Name': ['Joe', 'Ellen', 'Zach'],
                   'Department': ['A', 'A', 'A']})

^{}名称计算新数据帧:

df = pd.DataFrame(product(df['Name'].unique(),
                          ['A', 'B', 'C', 'D']),
                  columns=df.columns)

df

     Name Department
0     Joe          A
1     Joe          B
2     Joe          C
3     Joe          D
4   Ellen          A
5   Ellen          B
6   Ellen          C
7   Ellen          D
8    Zach          A
9    Zach          B
10   Zach          C
11   Zach          D

另一种方法是使用^{}

>>> departments = ['A', 'B', 'C', 'D']
>>> df.groupby('Name').apply(lambda _, L=departments: L).explode().to_frame('Department')
      Department
Name            
Ellen          A
Ellen          B
Ellen          C
Ellen          D
Joe            A
Joe            B
Joe            C
Joe            D
Zach           A
Zach           B
Zach           C
Zach           D

或者^{}有一个name参数:在这种配置中很方便:

>>> df.groupby('Name').apply(lambda _, L=departments: L).explode().reset_index(name='Department')
     Name Department
0   Ellen          A
1   Ellen          B
2   Ellen          C
3   Ellen          D
4     Joe          A
5     Joe          B
6     Joe          C
7     Joe          D
8    Zach          A
9    Zach          B
10   Zach          C
11   Zach          D

相关问题 更多 >