请帮助找到一个最佳的解决方案,为这项任务。
我们有一个pandas dataframe,它有两个主要的日期列和许多其他列(以及> 20 mln行)。
下面是数据集的一个玩具示例:
df = pd.DataFrame({'date1': [pd.Timestamp('2021-04-15'), pd.Timestamp('2020-05-01'), pd.Timestamp('2022-12-31'), pd.Timestamp('2020-11-01')],
'sample_date': [pd.Timestamp('2022-04-30'), pd.Timestamp('2022-04-30'), pd.Timestamp('2022-01-30'), pd.Timestamp('2021-12-30')],
'clients': ['client1', 'client2', 'client1', 'client2'],
'products': ['product1', 'product2', 'product3', 'product4']})
})
The input df
我们需要groupby并在客户端级别上转换dataframe,但条件是我们为每个客户端使用特定的窗口:仅当date 1 + 12 m <= sample_date时。
结果将是df dataframe中具有以下值的新列:The result:
下面是我非常慢的代码,它可以工作,但它非常慢:请帮助使用pandas方法优化它,我还不知道!
# initialzing outcome column
df['count_products'] = np.nan
for i in range(df.shape[0]):
df_temp = df[(df['date1'] + pd.DateOffset(months=12)) <= df['sample_date'].iloc[i]]
df_temp = df_temp[df_temp['clients'] == df['clients'].iloc[i]]
df['count_products'][i] = df_temp.groupby('clients')['products'].count()
我会很感激任何帮助!
最新更新31.05.2023:其他数据集:
df = pd.DataFrame({'date1': [pd.Timestamp('06.08.2018'), pd.Timestamp('30.07.2019'), pd.Timestamp('07.07.2021'), pd.Timestamp('01.11.2020')],
'sample_date': [pd.Timestamp('31.05.2018'), pd.Timestamp('24.07.2019'), pd.Timestamp('28.06.2021'), pd.Timestamp('30.12.2021')],
'clients': ['client1', 'client1', 'client1', 'client2'],
'products': ['product1', 'product2', 'product3', 'product4']})
结果
最新更新:逻辑是为每个客户端& sample_date对计数date 1至少等于12 M之前的产品的数量。
2条答案
按热度按时间nue99wik1#
你的filter和groupby代码看起来不错,你只需要将它应用于整个dataframe。
更新
IIUC,对于每个
clients
和sample_date
对,您希望计算date1
至少等于12M之前的产品。如果是这种情况,您可以执行自连接并使用条件计数。
结果
nnsrf1az2#
如果你把所有东西都矢量化,可能会更快。此外,您还需要
cumcount
和first
(这里假设第一个日期是最早的)。输出量