考虑下面的简化示例数据帧^ {CD1>}:
Department CustomerID Date Price MenswearDemand HomeDemand
0 Menswear 418089 2019-04-18 199 199 0
1 Menswear 613573 2019-04-24 199 199 0
2 Menswear 161840 2019-04-25 199 199 0
3 Menswear 2134926 2019-04-29 199 199 0
4 Menswear 984801 2019-04-30 19 19 0
5 Home 398555 2019-01-27 52 0 52
6 Menswear 682906 2019-02-03 97 97 0
7 Menswear 682906 2019-02-03 97 97 0
8 Menswear 923491 2019-02-09 80 80 0
9 Menswear 1098782 2019-02-25 258 258 0
10 Menswear 721696 2019-03-25 12 12 0
11 Menswear 695706 2019-04-10 129 129 0
12 Underwear 637026 2019-01-18 349 0 0
13 Underwear 205997 2019-01-25 279 0 0
14 Underwear 787984 2019-02-01 27 0 0
15 Underwear 318256 2019-02-01 279 0 0
16 Underwear 570454 2019-02-14 262 0 0
17 Underwear 1239118 2019-02-28 279 0 0
18 Home 1680791 2019-04-04 1398 0 1398
我想根据'CustomerID'
对这些数据进行分组,然后:
'Date'
转换为截止日期之前的天数,即'2021-01-01'
。这正是从客户最近购买到'2021-01-01'
的时间李>'MenswearDemand'
和'HomeDemand'
李>我应该得到的结果是:
Date MenswearDemand HomeDemand
CustomerID
161840 6 199 0
205997 96 0 0
318256 89 0 0
398555 94 0 52
418089 13 199 0
570454 76 0 0
613573 7 199 0
637026 103 0 0
682906 87 194 0
695706 21 129 0
721696 37 12 0
787984 89 0 0
923491 81 80 0
984801 1 19 0
1098782 65 258 0
1239118 62 0 0
1680791 27 0 1398
2134926 2 199 0
我就是这样设法解决这个问题的:
df['Date'] = pd.to_datetime(df['Date'])
cutoffDate = df['Date'].max() + dt.timedelta(days = 1)
newdf = df.groupby('CustomerID').agg({'Date': lambda x: (cutoffDate - x.max()).days,
'MenswearDemand': lambda x: x.sum(),
'HomeDemand': lambda x: x.sum()})
然而,实际上我得到了大约1500万行和30个需求列。我真的不想每次都在聚合函数中写入所有这些'DemandColumn': lambda x: x.sum()
,因为它们都应该求和。有更好的方法吗?比如传入要对其执行特定操作的列子集的数组
仅给出一个基于convtools的备选方案:
使用这个库的好处是它是轻量级的,没有依赖性,允许流处理,而且由于生成的代码简单,有时它并不比pandas/polars慢
如果预先知道列名,则可以在传递到
agg
函数之前构建字典另一个选项(知道列名,} 函数传递所需列的列表作为
DemandColumns
在上一个示例中)是首先使用agg
函数计算Date
列,然后使用^{items
参数,以仅保留那些精确的列如果所需的列(
DemandColumns
)遵循给定的模式,则可以排除列表创建,并将filter
函数与regex
参数一起使用。在这种情况下,可以使用regex'.*Demand$'
返回以Demand
字符串结尾的所有列相关问题 更多 >
编程相关推荐