当前位置: 首页 > 面试题库 >

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

黄景胜
2023-03-14
问题内容

我有一个DataframePandas同一个字母和两个日期为列。我想使用来计算上一行的两个日期列之间的营业日shift(),前提是Letter值相同(使用.groupby())。我正在使用.apply()。这一直有效,直到我传递了一些缺少某个日期的数据。我将所有内容移至一个函数以使用try/except子句处理缺少的值,但是现在我的函数返回NaN了所有内容。看来Nonedate的值会影响函数的每次调用,而我认为只有当Letterfrom是.groupby()is时,它才会起作用A

import pandas as pd
from datetime import datetime
import numpy as np

def business_days(x):
    try:
      return pd.DataFrame(np.busday_count(x['First Date'].tolist(), x['Last Date'].tolist())).shift().reset_index(drop=True)
    except ValueError:
        return None

df = pd.DataFrame(data=[['A', datetime(2016, 1, 7), None],
                        ['A', datetime(2016, 3, 1), datetime(2016, 3, 8)],
                        ['B', datetime(2016, 5, 1), datetime(2016, 5, 10)],
                        ['B', datetime(2016, 6, 5), datetime(2016, 6, 7)]],
                  columns=['Letter', 'First Date', 'Last Date'])

df['First Date'] = df['First Date'].apply(lambda x: x.to_datetime().date())
df['Last Date'] = df['Last Date'].apply(lambda x: x.to_datetime().date())

df['Gap'] = df.groupby('Letter').apply(business_days)

print df

实际输出:

  Letter  First Date   Last Date  Gap
0      A  2016-01-07         NaT  NaN
1      A  2016-03-01  2016-03-08  NaN
2      B  2016-05-01  2016-05-10  NaN
3      B  2016-06-05  2016-06-07  NaN

所需输出:

  Letter   First Day    Last Day   Gap
0      A  2016-01-07         NAT  NAN
1      A  2016-03-01  2016-03-08  NAN
2      B  2016-05-01  2016-05-10  NAN
3      B  2016-06-05  2016-06-07  7

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

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

  • 在计算完所有工作日计数之后,我们要做的只是分组 Letter并将值向下 移动 一。可以用完成 groupby/transform('shift')

import datetime as DT
import numpy as np
import pandas as pd

def 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 result

df = 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.0

df['Gap'] = df.groupby('Letter')['Gap'].transform('shift')
print(df)

版画

  Letter First Date  Last Date  Gap
0      A 2016-01-07        NaT  NaN
1      A 2016-03-01 2016-03-08  NaN
2      B 2016-05-01 2016-05-10  NaN
3      B 2016-06-05 2016-06-07  6.0


 类似资料:
  • 我为我的草图创建了一个简单的延迟函数,并试图使用它,但似乎渲染停止了,也就是说,有一个简单的灰色屏幕,然后一切都被一次渲染。 有人能告诉我我在哪里吗出错了?到底发生了什么? 如何在内部定义绘制()和设置()?我知道,set()是一个一次性的渲染和绘制(),就像一个无限的循环。 代码:

  • 我有一个包含两个功能的处理应用程序。第一个被称为加载屏幕。第二个叫做主菜单。当应用程序初始化时,它调用函数“loadScreen();”。我在这个函数中设置了一个计时器,这样5秒钟后,它就会跳转到“主菜单”。问题是,如何停止我的函数并调用另一个函数?有没有“Rest”或者我可以使用的“停止”功能?谢谢

  • 4.5 ABP应用层 - 功能管理 4.5.1 简介 大多数的SaaS(多租户) 应用拥有多个版本并且这些版本的功能各不相同。因此,他们能为客户提供不同的价格和功能选项。 我们可以很容易的用ABP来实现这个功能管理系统。我们能定义一些功能,检查功能是否为租户开启。这个就像ABP的设计思想(例如权限和菜单设计)。 关于 IFeatureValueStore 我们可以利用 IFeatureValueS

  • 1. 功能介绍 我们的小程序可以在任一已经集成 FinClip SDK 的应用中使用,但为了安全性与权限控制,需要将小程序与应用进行关联操作。通过将小程序与应用进行关联,并且获得对应的 SDK KEY 与 SDK SECRET 后,应用就可以完成 FinClip SDK 的初始化,并且打开对应的小程序。 2. 功能设置 当小程序需要关联对应的应用时,需要先行在【应用管理】中进行对应设置,否则小程序

  • 我有以下Spring Boot类,用自定义注释注释: 注释定义如下: 我想要的是编写一个注释处理器,有效地使我的控制器像下面的代码一样工作。 我已经能够在运行时通过反射实现这一点,但这大大延长了启动时间。有没有办法只使用注释和自定义注释处理器来实现上述功能?换句话说,我想创建一个注释,将带注释的方法添加到类中,并将任意方法调用添加到现有方法中。 我知道注释处理并不真正支持修改源代码。我有兴趣知道任

  • 问题内容: 在过去的几天里,我一直在学习React,研究一些有关编写不同元素的不同方式的教程和说明。但是,我最想知道的是- 更新/覆盖组件属性的功能。 例如,假设我有一个包含以下内容的类: 这个例子让我从API获取图像。 鉴于我已经执行了此函数的获取,映射和返回操作-然后,我将使用在API调用中获得的结果来更新状态数组。 我的问题源于我所见过的关于如何更新/覆盖图片状态属性的不同方法。 我看到它以

  • 以列表的方式获取当前服务器上可以进行防护的应用,针对不同的应用使用不同的方式进行防护。

  • 我在创建Azure函数时注意到,一个函数App可以有多个函数。 有人能给我解释一下这背后的原理吗? 我的猜测 - 由于函数应用决定了托管(应用服务计划或消耗计划),因此你可以在应用服务计划上有一个函数应用,然后在该函数应用内有多个函数共享同一应用服务计划。 但这在消费计划中没有意义,因为如果你有一个具有“消费”计划的功能应用程序,其中包含2个功能,这与将两个功能拆分为具有消费计划的2个功能应用程序