根据 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
的员工姓名,但也基于 position
的 commencementDate
。比如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
日期是小于还是大于 position
的 commencementDate
。也尝试在位置上将 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
我有一个包含“职位”和“上任日期”的 DataFrame:
position cameToOfficeDate
CEO 2020-06-01
CEO 2021-01-01
CEO 2021-02-02
Slave 2020-01-01
我想将 position
映射到不同 cameToOfficeDate
的员工姓名,但也基于 position
的 commencementDate
。比如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
日期是小于还是大于 position
的 commencementDate
。也尝试在位置上将 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