Python数据帧迭代行(比较行之间的值)并准备一个组作为输出
我有一个这样的数据帧 我想按url和状态对它们进行分组,并按日期拆分记录,这是一种更有效的方法吗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,
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']