根据 pandas DataFrame 中的日期将位置映射到名称

Mapping positions to names based on date in a pandas DataFrame

我有一个包含“职位”和“上任日期”的 DataFrame:

position  cameToOfficeDate
CEO       2020-06-01
CEO       2021-01-01
CEO       2021-02-02
Slave     2020-01-01

我想将 position 映射到不同 cameToOfficeDate 的员工姓名,但也基于 positioncommencementDate。比如CEO在2021年前是Bill,2021年后是Mark。

position  commenceDate  Name
CEO       2020-01-01    Bill
CEO       2021-01-01    Mark
Slave     2020-01-01    Elon

所以输出应该是:

position  cameToOfficeDate  Name
CEO       2020-06-01        Bill
CEO       2021-01-01        Mark
CEO       2021-02-02        Mark
Slave     2020-01-01        Elon

我想知道如何创建映射 table 结构。我尝试使用字典,但它不允许比较 cameToOfficeDate 日期是小于还是大于 positioncommencementDate。也尝试在位置上将 table 连接在一起,但它不起作用。

您可以使用 merge_asof。由于 merge_asof 期望对键进行排序,因此我们将日期转换为 datetime 对象并排序;然后 merge.

df1['cameToOfficeDate'] = pd.to_datetime(df1['cameToOfficeDate'])
df2['commenceDate'] = pd.to_datetime(df2['commenceDate'])
out = (pd.merge_asof(df1.sort_values(by='cameToOfficeDate'), 
                     df2.sort_values(by='commenceDate'), 
              left_on='cameToOfficeDate', right_on='commenceDate', 
                     by='position')
       .drop(columns='commenceDate')
       .sort_values(by=['position','cameToOfficeDate']))

输出:

  position cameToOfficeDate  Name
1      CEO       2020-06-01  Bill
2      CEO       2021-01-01  Mark
3      CEO       2021-02-02  Mark
0    Slave       2020-01-01  Elon