Python数据帧迭代行(比较行之间的值)并准备一个组作为输出

Python数据帧迭代行(比较行之间的值)并准备一个组作为输出,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个这样的数据帧 我想按url和状态对它们进行分组,并按日期拆分记录,这是一种更有效的方法吗 def transform_to_unique(df): test = [] counter = 0 #first_row if df.loc[0, 'status']!= df.loc[1, 'status']: counter = counter +1 test.append(counter) for i in range(1,

我有一个这样的数据帧 我想按url和状态对它们进行分组,并按日期拆分记录,这是一种更有效的方法吗

def transform_to_unique(df):
    test = []
    counter = 0

    #first_row
    if df.loc[0, 'status']!= df.loc[1, 'status']:
        counter = counter +1
    test.append(counter)

    for i in range(1, len(df)):

        if df.loc[i-1, 'url']!= df.loc[i, 'url']:
            counter=0

        if df.loc[i-1, 'status']!= df.loc[i, 'status'] :
            counter = counter +1
        test.append(counter)

    df['test'] = pd.Series(test)

    return df

df = transform_to_unique(frame)

df_g = df.groupby(['url', 'status', 'test'])['date_scraped'].agg({min, max})

这是一个数据帧:

1000,20191109,active 1000,20191108,inactive 2000,20191109,active 2000,20191101,inactive 351,20191109,active 351,20191102,active 351,20191026,active 351,20191019,active 351,20191012,active 351,20191005,active 351,20190928,inactive 351,20190921,inactive 351,20190914,inactive 351,20190907,active 351,20190831,active 351,20190615,inactive 3000,20200101,active
我不确定我是否正确理解了
test
列的标题,但这就是您想要实现的目标(基于您发布的样本数据):

将numpy导入为np
df.sort_值([“url”,“date_scraped”],axis=0,升序=True,原地=True)
df[“日期”\u刮到”]=np.where(df[“url”]==df[“url”].shift(-1),
df[“日期”].shift(-1),np.nan.astype(np.int32)
输出:

url日期\u刮取状态日期\u刮取时间\u
15351 20190615非活动20190831
14351 20190831现行20190907
13351 20190907有效20190914
12351 20190914非活动20190921
11351 20190921非活动20190928
10351 20190928非活动20191005
9351 20191005现行20191012
8351 20191012现行20191019
7351 20191019现行20191026
635120191026现行20191102
5351 20191102活动20191109
435120191109活动0
1 1000 20191108非活动20191109
0 1000 20191109活动0
3 2000 20191101非活动20191109
2 2000 20191109活动0
16 3000 20200101激活0
编辑

如果您不是说“拆分”而是指“折叠”,那么应该这样做(这基本上是执行<代码>测试列的更有效的方法):

将numpy导入为np
df.sort_值([“url”,“date_scraped”],axis=0,升序=True,原地=True)
df[“test”]=np.其中((df[“url”]==df[“url”].shift(1))和(df[“status”]==df[“status”].shift(1)),0,1)
df[“test”]=df.groupby([“url”,“status”,“test”])[“test”].cumsum().replace(to_replace=0,method='ffill'))
df_g=df.groupby(['url','status','test'])['date_scraped'].agg({min,max})
输出:

max-min
url状态测试
351活动1 20190907 20190831
2     20191109  20191005
非活动1 20190615 20190615
2     20190928  20190914
1000活动1 20191109 20191109
非活动1 20191108 20191108
2000活动1 20191109 20191109
非活动1 20191101 20191101
3000活动1 20200101 20200101

谢谢您的回答,这很好:-)我必须了解更多关于groupbing的信息,我不知道我可以按某个字段分组,然后在[]括号中使用它们。groupby([“url”,“status”,“test”])[“test”]。cumsum()
import pandas as pd
frame =pd.read_clipboard(sep=",", header=None)
frame.columns = ['url', 'date_scraped', 'status']