【问题标题】:Dates inclusive/overlapping in company data公司数据中包含/重叠的日期
【发布时间】: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


    【解决方案1】:

    您的问题不完整。您不仅要将该公司与之前的公司进行比较,还可以将之前的公司与之前的公司进行比较,如果之前的公司应该被淘汰。

    否则,这将是一个简单的比较:

    df.groupby('EID').apply(
        lambda group: group[~(
            (group.SD >= group.SD.shift()) &
            (group.ED <= group.ED.shift())
        )]
    )
    

    但是,这会导致以下结果:

    EID     company SD          ED
    B12345  A11     1/1/2021    3/1/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  C11     1/1/2022    12/31/2022
    

    现在,您想比较 C11 和 A11。您可以使用(不那么优雅的)while loop

    different = True
    while different:
        df_orig = df.copy()
        df = df.groupby('EID').apply(lambda group: group[~((group.SD >= group.SD.shift()) & (group.ED <= group.ED.shift()))]).reset_index(drop=True)
        different = not df.equals(df_orig)
    

    这将继续执行相同的技巧,并且只有在结果数据帧等于原始数据帧时才会停止。

    导致:

    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
    

    【讨论】:

    • 我现在明白你在说什么了。是的,如果以前的公司被删除,我确实需要将当前公司与以前的公司进行比较。将在整个数据集上尝试此解决方案,并在出现任何问题时进行更新。谢谢你。!我也会根据评论编辑问题。
    • 我正在为近 1L 行执行此操作,并且花费的时间太长。我 15 分钟前开始执行它,它仍在执行。只是想知道是否可以采取任何措施来加快执行速度,例如使用任何不同的功能等等。?
    • 正如我所说,它并不那么优雅。在较大的数据帧上,这可能不是一个可行的选择。
    • 酷...没问题。!谢谢。!一旦执行完成并验证输出,将对此进行投票。!
    • 成功了!虽然执行 11.5 万行需要 1 小时 50 分钟,但它确实有效。!非常感谢您的解决方案。也投了赞成票。!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多