【发布时间】:2021-12-29 07:02:15
【问题描述】:
您好,我有以下数据集:
| EID | company | SD | ED |
|---|---|---|---|
| B12345 | A11 | 1/1/2021 | 3/1/2021 |
| B12345 | B11 | 1/1/2021 | 1/20/2021 |
| B12345 | C11 | 1/21/2021 | 2/1/2021 |
| B12345 | C11 | 2/2/2021 | 3/1/2021 |
| B12346 | A11 | 1/1/2010 | 12/31/2021 |
| B12346 | B11 | 1/1/2011 | 12/31/2015 |
| B12346 | C11 | 1/1/2022 | 12/31/2022 |
您可能已经在此处观察到 EID B12345 的日期,公司 B11 和 C11 分别包含公司 A11 的日期。同样,对于 EID B12346,公司 B11 的日期也包括公司 A11 的日期。因此,我在这里要做的是针对数据框中的所有 EID,我要检查每个公司的开始日期 (SD) 和结束日期 (ED) 是否包括以前的公司。如果它们是包容性的,那么最终日期应该取自日期在最大范围内的公司。如果日期不同,则按原样获取数据。所以输出应该包含公司 A11 的日期。
基本上,我想在这里检查的是每个 eid 的两个日期列之间是否存在与公司相关的重叠,如果存在则取最大范围,否则保持数据不变。此外,它不仅将公司与以前的公司进行比较,而且还与之前的公司进行比较,如果以前的公司应该被淘汰。预期输出如下:
| EID | company | SD | ED |
|---|---|---|---|
| B12345 | A11 | 1/1/2021 | 3/1/2021 |
| B12346 | A11 | 1/1/2010 | 12/31/2021 |
| B12346 | C11 | 1/1/2022 | 12/31/2022 |
下面是我试过的代码:
group = (df['SD'] <= df.groupby(['EID'['END'].shift()).groupby([df['EID']]).cumsum()
df = df.loc[df.groupby([df['EID'], group])['company'].idxmax()].sort_index()
我在这里遇到的错误是:
TypeError: reduction operation 'argmax' not allowed for this dtype
我一直无法理解这个错误的含义。我什至尝试更改公司列的数据类型,但仍然无法修复它。
任何线索将不胜感激。谢谢!
【问题讨论】:
标签: python python-3.x pandas for-loop