使用Pandas Groupby和应用功能时处理None值

使用Pandas Groupby和应用功能时处理None值,第1张

使用Pandas Groupby和应用功能时处理None值
  • NaT
    暂时忽略s,请注意,
    np.busday_count
    可以
    df
    应用 之前 对整列进行计算
    groupby
    。这将节省时间,因为它将
    np.busday_count
    一个的调用替换为的许多调用(每个组一个)
    np.busday_count
    。通常,对大型数组进行一个函数调用要比对小型数组进行许多函数调用要快。

  • 要处理

    NaT
    s,您可以
    pd.notnull
    用来标识具有
    NaT
    s的行并屏蔽
    First Date
    s和
    Last Date
    s,以便仅将有效日期发送到
    np.busday_count
    。然后,您可以
    NaN
    为日期中有
    NaT
    s的行填写。

  • 在计算完所有工作日计数之后,我们要做的只是分组

    Letter
    并将值向下 移动 一。可以用完成
    groupby/transform('shift')


import datetime as DTimport numpy as npimport pandas as pddef business_days(start, end):    mask = pd.notnull(start) & pd.notnull(end)    start = start.values.astype('datetime64[D]')[mask]    end = end.values.astype('datetime64[D]')[mask]    result = np.empty(len(mask), dtype=float)    result[mask] = np.busday_count(start, end)    result[~mask] = np.nan    return resultdf = pd.Dataframe(data=[['A', DT.datetime(2016, 1, 7), None],  ['A', DT.datetime(2016, 3, 1), DT.datetime(2016, 3, 8)],  ['B', DT.datetime(2016, 5, 1), DT.datetime(2016, 5, 10)],  ['B', DT.datetime(2016, 6, 5), DT.datetime(2016, 6, 7)]],       columns=['Letter', 'First Date', 'Last Date'])df['Gap'] = business_days(df['First Date'], df['Last Date'])print(df)#   Letter First Date  Last Date  Gap# 0      A 2016-01-07        NaT  NaN# 1      A 2016-03-01 2016-03-08  5.0# 2      B 2016-05-01 2016-05-10  6.0# 3      B 2016-06-05 2016-06-07  1.0df['Gap'] = df.groupby('Letter')['Gap'].transform('shift')print(df)

版画

  Letter First Date  Last Date  Gap0      A 2016-01-07        NaT  NaN1      A 2016-03-01 2016-03-08  NaN2      B 2016-05-01 2016-05-10  NaN3      B 2016-06-05 2016-06-07  6.0


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/5601891.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-12-15
下一篇2022-12-15

发表评论

登录后才能评论

评论列表(0条)

    保存