【问题标题】:Complicated function with groupby and between? Pythongroupby 和 between 的复杂功能? Python
【发布时间】:2020-11-07 14:55:08
【问题描述】:

这是一个示例数据集。

import pandas as pd
import numpy as np
df = pd.DataFrame({ 
    'VipNo':np.repeat( range(3), 2 ),
    'Quantity': np.random.randint(200,size=6),
    'OrderDate': np.random.choice( pd.date_range('1/1/2020', periods=365, freq='D'), 6, replace=False)})
print(df)

所以我有几个步骤要做。我想创建一个名为 qtywithin1mon/totalqty 的新列。首先,我想对 VipNo 进行分组(每个数字代表一个人),因为一个人可能进行了多次购买。然后我想看看 orderdate 是否在某个范围内(比如说 2020/03/01 - 2020/03/31)。如果是这样,我想使用当天的相应数量除以该客户购买的总数量。我的数据集很大,因此客户可能在时间范围内订购了两次,在这种情况下,我希望将两个订单的总和除以总数量。我怎样才能实现这个目标?我真的不知道从哪里开始..

非常感谢!

【问题讨论】:

  • ...当天的数量除以总数量此客户购买,这个总数是总总数还是给定范围内的总数范围?
  • 这是总数

标签: python pandas datetime group-by


【解决方案1】:

您可以在给定的日期范围内创建一个新的列掩码数量,然后分组:

start, end = pd.to_datetime(['2020/03/01','2020/03/31'])

(df.assign(QuantitySub=df['OrderDate'].between(start,end)*df.Quantity)
   .groupby('VipNo')[['Quantity','QuantitySub']]
   .sum()
   .assign(output=lambda x: x['QuantitySub']/x['Quantity'])
   .drop('QuantitySub', axis=1)
)

使用数据框:

   VipNo  Quantity  OrderDate
0      0       105 2020-01-07
1      0        56 2020-03-04
2      1       167 2020-09-05
3      1        18 2020-05-08
4      2       151 2020-11-01
5      2        14 2020-03-17

输出是:

       Quantity    output
VipNo            
0           161  0.347826
1           185  0.000000
2           165  0.084848

【讨论】:

  • 谢谢!我是否可以在不创建“QuantitySub”的情况下创建此输出列?并且不要过于复杂?
  • .drop('QuantitySub', axis=1)链接代码。查看更新
  • 也许我可以在不分配新列但直接产生这些结果的情况下做到这一点?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多