【问题标题】:How to generate new dataframe from SQL like clause?如何从 SQL like 子句生成新的数据框?
【发布时间】:2018-05-03 20:24:43
【问题描述】:

我有一个这样的数据框。我们称之为df1:

  zone          script    datetimecomplete
0   2.0       Consumers 2018-05-03 16:09:48
1   2.0       Inventory 2018-05-03 16:09:48
2   2.0  Orders_Details 2018-05-03 16:09:48
3   3.0       Consumers 2018-05-03 16:09:48
4   3.0       Inventory 2018-05-03 16:09:48
5   3.0  Orders_Details 2018-05-03 16:09:48
6   6.0        Birthday 2018-05-03 16:09:48

我必须基于 df1 创建另一个数据框 (df2)。要求是对于每个 'zone' and 'script' 列,我需要生成过去 24 小时内的脚本计数(只需要比较日期而不是时间戳)。只需要追加 datetimecomplete 列是 Today 减去 1 天的行。

df2 需要有 4 列:

[zone, script, datetimecomplete, totalcount]

zone - 同 df1 脚本 - 与 df1 相同 datetimecomplete - 当前日期减去 1 天需要附加到 df2 totalcount - 需要计算从今天开始的最后 24 小时内的每个单独脚本。

df2 示例:

 zone          script    datetimecomplete    totalcount
  2.0       Consumers 2018-05-02 16:09:48     2
  2.0       Inventory 2018-05-02 16:09:48     1
  2.0  Orders_Details 2018-05-02 16:09:48     1
  3.0       Consumers 2018-05-02 16:09:48     1
  3.0       Inventory 2018-05-02 16:09:48     1
  3.0  Orders_Details 2018-05-02 16:09:48     4
  6.0        Birthday 2018-05-02 16:09:48     6

我不知道该怎么做。

到目前为止的代码,我得到了计数,但不是从 df1 开始的最后 24 小时,也没有创建 totalcount 列:

df2 = df1.groupby(['zone', 'script', df1['datetimecomplete'] - pd.Timedelta(days=1)])['script'].count() 

我正在尝试完成的示例 SQL 查询:

select df1.zone, df1.script, currentdate - 1 as [datetimecomplete], count(df1.zone) as [TotalCount]

from [df1] as a

where df1.datetimecomplete = currentdate - 1

group by df1.zone, df1.script

提前谢谢你。

【问题讨论】:

  • 示例中显示的df1 是否足以生成df2?我的意思是,我没有看到 birthday 脚本的 6 个计数。
  • @HarvIpan 6 不是计数,而是内部代码。我认为制作df2就足够了
  • 我实际上指的是totalcount 生日。

标签: python pandas dataframe


【解决方案1】:

因此,如果我理解,要执行您的问题,您可以创建一个 mask_24h 以在过去 24 小时内从 df1 中选择数据:

h24_ago = (pd.Timestamp.today() - pd.Timedelta(days=1)).date() # time 24h ago
mask_24h = df1['datetimecomplete'] >= h24_ago

然后要创建您的df2,您可以使用groupby,但我会这样做:

df2 = df1[mask_24h ].groupby(['zone','script']).\
         count().reset_index().rename(columns = {'datetimecomplete':'totalcount'})

在这里,您可以使用 df1[mask_date] 在过去 24 小时内从 df1 中选择数据,然后在 'zone''script' 上选择 groupby() 并继续 count()reset_index() 允许保留其他列,rename() 允许重命名。现在您只是错过了'datetimecomplete' 列,所以这样做:

df2['datetimecomplete'] = h24_ago

希望有效果

【讨论】:

  • 嗨,谢谢您的回复,这是我需要的。但是日期比较不起作用。当 df1 中没有少于今天减去 1 天的记录时,我的总计数仍然为 1。计数应为零。有没有办法只比较日期而不比较时间戳?
  • @RustyShackleford 不确定我是否理解,当您说日期时,您的意思是当天?所以就像您希望所有脚本在昨天运行,或者脚本从现在到昨天午夜运行?
  • 没错,我的意思是那天。我的脚本在现在和昨天午夜之间运行。
  • @RustyShackleford 看到我的编辑,但我猜你是按照你的回复做的:)
猜你喜欢
  • 2015-09-13
  • 1970-01-01
  • 2011-07-28
  • 2019-04-29
  • 2023-03-15
  • 1970-01-01
  • 2011-01-07
  • 1970-01-01
  • 2018-07-29
相关资源
最近更新 更多