在PANDAS groupby中对具有连续日期的行进行计数

2024-10-04 09:18:04 发布

您现在位置:Python中文网/ 问答频道 /正文

This is the closest to what i'm looking for that I've found

假设我的数据帧如下所示:

d = {'item_number':['K208UL','AKD098008','DF900A','K208UL','AKD098008']
     'Comp_ID':['998798098','988797387','12398787','998798098','988797387']
     'date':['2016-11-12','2016-11-13','2016-11-17','2016-11-13','2016-11-14']}

df = pd.DataFrame(data=d)

我想计算连续几天观察到相同的item_number和{}的次数。在

我想这将是一个大致的思路:

^{pr2}$

但是,在比较之前,我需要从每个日期中提取日期作为int,这也是我遇到的问题。在

for i in df.index:
    wbc_seven.iloc[i, 'day_column'] = datetime.datetime.strptime(df.iloc[i,'date'],'%Y-%m-%d').day

显然基于位置的索引只允许整数?我怎样才能解决这个问题?在


Tags: thetonumberdffordatetimedateis
2条回答

However, I would need to extract the day from each date as an int before comparing, which I'm also having trouble with.

为什么?

要修复代码,您需要:

consecutive['date'] = pd.to_datetime(consecutive['date'])
g = consecutive.groupby(['Comp_ID','item_number'])
g['date'].apply(lambda x: sum(abs((x.shift(-1) - x)) == pd.to_timedelta(1, unit='D')))

注意以下几点:

  1. 上面的代码避免了重复。这是一个基本的编程原则:Don't Repeat Yourself
  2. 它将1转换为timedelta,以便进行适当的比较。
  3. 它需要绝对的差异。

提示:为您的工作编写一个顶层函数,而不是lambda,因为它具有更好的可读性、简洁性和美观性:

^{pr2}$

说明:

这很简单。日期是converted to ^{} type,然后减去。这种差异将导致^{},它还需要与timedelta对象进行比较,因此需要将1(或day_dif)转换为timedelta。转换的结果将是一个布尔级数。布尔值用0表示False,1表示True。布尔级数的和将返回序列中True值的总数。在

一种解决方案是使用pivot表来计算连续几天观察到Comp_ID和{}的次数。在

import pandas as pd

d = {'item_number':['K208UL','AKD098008','DF900A','K208UL','AKD098008'],'Comp_ID':['998798098','988797387','12398787','998798098','988797387'],'date':['2016-11-12','2016-11-13','2016-11-17','2016-11-13','2016-11-14']}

df = pd.DataFrame(data=d).sort_values(['item_number','Comp_ID'])
df['date'] = pd.to_datetime(df['date'])
df['delta'] = (df['date'] - df['date'].shift(1))
df = df[(df['delta']=='1 days 00:00:00.000000000') & (df['Comp_ID'] == df['Comp_ID'].shift(1)) & 
        (df['item_number'] == df['item_number'].shift(1))].pivot_table( index=['item_number','Comp_ID'],
           values=['date'],aggfunc='count').reset_index()
df.rename(columns={'date':'consecutive_days'},inplace =True)

结果

^{pr2}$

相关问题 更多 >