pandas 计数数据框中小于另一列中的值的值的数量

vuktfyat  于 2023-11-15  发布在  其他
关注(0)|答案(3)|浏览(80)

给定一个像下面这样的结构,对于登记日期中的每个日期,我如何计算关闭日期中前面几行中较早的值的数量?理想情况下,我希望将结果添加为一个新列。
| 类|登记日期|关闭日期|
| --|--|--|
| 一|二○ ○三年十月三十日|二零零三年十二月五日|
| 一|二零零三年十二月二十二日|2005年9月23日|
| 一|2005年9月6日|2005年9月29日|
| 一|2005年11月15日|2005年12月7日|
| 一|二○ ○六年二月二十七日|二○ ○六年三月二十八日|
预期结果:
| 类|登记日期|关闭日期|先前日期|
| --|--|--|--|
| 一|二○ ○三年十月三十日|二零零三年十二月五日| 0 |
| 一|二零零三年十二月二十二日|2005年9月23日| 1 |
| 一|2005年9月6日|2005年9月29日| 1 |
| 一|2005年11月15日|2005年12月7日| 3 |
| 一|二○ ○六年二月二十七日|二○ ○六年三月二十八日| 4 |

xoefb8l8

xoefb8l81#

使用triu的可能选项:

cols = ["Enrol Date", "Close Date"]
df[cols] = df[cols].apply(pd.to_datetime, dayfirst=True)

enrol = df["Enrol Date"].to_numpy()
close = df["Close Date"].to_numpy()[:, None]

df["Prior Dates"] = np.triu(enrol>close).sum(0)

字符串
输出量:

print(df)

  Class Enrol Date Close Date  Prior Dates
0     A 2003-10-30 2003-12-05            0
1     A 2003-12-22 2005-09-23            1
2     A 2005-09-06 2005-09-29            1
3     A 2005-11-15 2005-12-07            3
4     A 2006-02-27 2006-03-28            4

ohfgkhjo

ohfgkhjo2#

您可以在自定义groupby.apply函数中将numpy广播与tril一起使用:

def earlier_count(g):
    return pd.DataFrame({'count':
             np.tril(  g['Enrol Date'].to_numpy()[:,None]
                     > g['Close Date'].to_numpy()
                     ).sum(axis=1)},
             )

df['count'] = df.groupby('Class', group_keys=False).apply(earlier_count)

字符串
输出量:

Class Enrol Date Close Date  count
0     A 2003-10-30 2003-12-05      0
1     A 2003-12-22 2005-09-23      1
2     A 2005-09-06 2005-09-29      1
3     A 2005-11-15 2005-12-07      3
4     A 2006-02-27 2006-03-28      4

uz75evzq

uz75evzq3#

您共享的数据已排序(在Close Date列上),因此二进制搜索应该足够了:

df.assign(**{'Prior Dates' : df['Close Date'].searchsorted(df['Enrol Date'], side='right')})

  Class Enrol Date Close Date  Prior Dates
0     A 2003-10-30 2003-12-05            0
1     A 2003-12-22 2005-09-23            1
2     A 2005-09-06 2005-09-29            1
3     A 2005-11-15 2005-12-07            3
4     A 2006-02-27 2006-03-28            4

字符串
如果你的数据没有排序,或者Class列是相关的,请在你的原始数据框中添加更多信息,并在Class列中添加不同的条目(BC,...)

相关问题