pandas 创建列,以标识另一列的第一个日期,并将数据框包含在内

s3fp2yjn  于 2023-01-07  发布在  其他
关注(0)|答案(1)|浏览(93)

假设我有一个 Dataframe ,其中包含员工ID、他们的雇用日期、合同类型(可以是员工或承包商)以及他们雇用的公司,每个员工可以有相同或不同公司以及相同或不同合同类型的多个行。

ID      Hire Date   Contract Type   Company
10000   2000.01.01  Employee        Abc
10000   2001.01.01  Contractor      Zxc
10000   2000.01.01  Employee        Abc
10000   2000.01.01  Contractor      Abc
10000   2002.01.01  Employee        Cde
10000   2002.01.01  Employee        Abc
10001   1999.03.11  Employee        Zxc
10002   1989.01.01  Employee        Abc
10002   1989.01.01  Contractor      Cde
10002   1988.01.01  Contractor      Zxc
10002   1999.01.01  Employee        Abc

根据每个ID和他们拥有的每个合同类型,我需要确定最早的雇用日期,并将其指定为他们雇用的每个唯一公司的主要分配(如果该ID有2行具有相同的合同类型和相同的雇用日期,则只需将其显示的第一个值设置为“是”),这样就会产生以下 Dataframe :

ID      Hire Date   Contract Type   Company     Primary Assignment
10000   2000.01.01  Employee        Abc         Yes
10000   2001.01.01  Contractor      Zxc         Yes
10000   2000.01.01  Employee        Abc         No
10000   2000.01.01  Contractor      Abc         Yes
10000   2002.01.01  Employee        Cde         Yes
10000   2002.01.01  Employee        Abc         No
10001   1999.03.11  Employee        Zxc         Yes
10002   1989.01.01  Employee        Abc         Yes
10002   1989.01.01  Contractor      Cde         Yes
10002   1988.01.01  Contractor      Zxc         Yes
10002   1999.01.01  Employee        Abc         No

实现这一目标的最佳途径是什么?

7cwmlq89

7cwmlq891#

您可以使用groupby.idxmin

date = pd.to_datetime(df['Hire Date'])
idx = date.groupby([df['ID'], df['Contract Type'], df['Company']]).idxmin()
df['Primary Assignment'] = np.where(df.index.isin(idx), 'Yes', 'No')

或者,如果您希望灵活地选择要保留的值,可以使用groupby.transform和遮罩:

date = pd.to_datetime(df['Hire Date'])
m1 = date.groupby([df['ID'], df['Contract Type'], df['Company']]).transform('min').eq(date)
m2 = ~df[['ID', 'Contract Type', 'Company']].duplicated()
df['Primary Assignment'] = np.where(m1&m2, 'Yes', 'No')

输出:

ID   Hire Date Contract Type Company Primary Assignment
0   10000  2000.01.01      Employee     Abc                Yes
1   10000  2001.01.01    Contractor     Zxc                Yes
2   10000  2000.01.01      Employee     Abc                 No
3   10000  2000.01.01    Contractor     Abc                Yes
4   10000  2002.01.01      Employee     Cde                Yes
5   10000  2002.01.01      Employee     Abc                 No
6   10001  1999.03.11      Employee     Zxc                Yes
7   10002  1989.01.01      Employee     Abc                Yes
8   10002  1989.01.01    Contractor     Cde                Yes
9   10002  1988.01.01    Contractor     Zxc                Yes
10  10002  1999.01.01      Employee     Abc                 No

相关问题