Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
分组数据帧-python_Python_Pandas_Pandas Groupby - Fatal编程技术网

分组数据帧-python

分组数据帧-python,python,pandas,pandas-groupby,Python,Pandas,Pandas Groupby,我有这个数据集 PRODUCT_ID SALE_DATE SALE_PRICE PROVIDER 1 01/02/16 25 1 1 02/10/16 60 1 1 01/11/16 63 2 1 09/10/16 65 3 2 11/11/15 54 1 2

我有这个数据集

PRODUCT_ID   SALE_DATE   SALE_PRICE PROVIDER
1            01/02/16    25         1
1            02/10/16    60         1
1            01/11/16    63         2
1            09/10/16    65         3
2            11/11/15    54         1
2            13/01/16    34         2
3            19/05/14    45         1
3            15/10/15    38         1
3            16/06/14    53         2
3            18/10/15    58         2
这是一个组合数据集,数据由不同的提供商提供,每个销售没有共同的标识符。这里的问题是,每个数据提供商的每次销售的日期和价格略有不同。因此,我试图将它们分组为一个组ID,因此这里的业务逻辑是数据提供者1首先获得销售数据,因此对于产品ID,如果供应商2或3的销售日期在1个月的时间内,并且价格在10美元差异(或多或少)内,我们认为它们是相同的销售,否则将被视为不同的销售。因此,输出应该如下所示:

PRODUCT_ID   SALE_DATE   SALE_PRICE PROVIDER  SALE_GROUP_ID
1            01/02/16    25         1          1
1            02/10/16    60         1          2
1            01/11/16    63         2          2
1            09/10/16    65         3          2
2            11/11/15    54         1          3 
2            13/01/16    34         2          4
3            19/05/14    45         1          5
3            15/10/15    38         1          6
3            16/06/14    53         2          5
3            18/10/15    58         2          7

我如何在熊猫身上做到这一点,有人能帮忙吗?谢谢。

我们可以在
排序\u值之后使用
groupby

df.SALE_DATE=pd.to_datetime(df.SALE_DATE,format='%d/%m/%y')
df=df.sort_values(['PRODUCT_ID','SALE_DATE','SALE_PRICE'])
df1=df.copy()
df1=df.copy().sort_index()


df1['SALE_GROUP_ID']=df.groupby([df['PRODUCT_ID'],(df['SALE_DATE'].diff().abs()/np.timedelta64(1, 'M')).lt(1).ne(1).cumsum(),df['SALE_PRICE'].diff().lt(10).ne(1).cumsum()]).ngroup().add(1).sort_index().values
df1
Out[294]: 
   PRODUCT_ID  SALE_DATE  SALE_PRICE  PROVIDER  SALE_GROUP_ID
0           1 2016-02-01          25         1              1
1           1 2016-10-02          60         1              2
2           1 2016-11-01          63         2              2
3           1 2016-10-09          65         3              2
4           2 2015-11-11          54         1              3
5           2 2016-01-13          34         2              4
6           3 2014-05-19          45         1              5
7           3 2015-10-15          38         1              6
8           3 2014-06-16          53         2              5
9           3 2015-10-18          58         2              7
更多信息:获取组时需要3个条件

 1. PRODUCT_ID
 2. Date different within in 1 month
 3. SALE_PRICE different less than 10
(df['SALE_DATE'].diff().abs()/np.timedelta64(1,'M')).lt(1).ne(1).cumsum()
,用于在一个月内获取日期组

(df['SALE_DATE'].diff().abs()/np.timedelta64(1, 'M')).lt(1).ne(1).cumsum()
Out[274]: 
0    1
1    2
3    2
2    2
4    3
5    4
6    5
8    5
7    6
9    6
Name: SALE_DATE, dtype: int32
df['SALE_PRICE'].diff().lt(10).ne(1).cumsum()
将在10内获取值

df['SALE_PRICE'].diff().lt(10).ne(1).cumsum()
Out[275]: 
0    1
1    2
3    2
2    2
4    2
5    2
6    3
8    3
7    3
9    4
Name: SALE_PRICE, dtype: int32

groupby
之后,我们只需组合(获得每个组条件的交集),然后我们使用
ngroup
获得组Id

18/10/15
11/11/15
在一个月内,并且有10美元的价差。它们是一样的吗?不是。因为他们有不同的产品id。产品id应该是相同的,才能视为相同的销售。
19/05/14
16/06/14
有相同的产品id,在一个月内,价差为10美元,并且是相同的销售。他们的销售ID是否需要按顺序排列?是的,这就是为什么他们被视为相同的销售。产品ID相同,一个月内有10美元的差异。因此被认为是相同的销售,销售组id相同。不,它们不需要按顺序排列。让我们。@ds\u用户对不起,我不能使用聊天,您可以更改为
df['SALE\u DATE'].diff()/np.timedelta64(1,'D')
这部分lt(50)是用来处理仓位大小的,我仍然不明白这一点。所以为了提到日差,我必须单独修改'lt',或者这也是np.timedelta64(1,'D')到np.timedelta64(50,'D')。这是正确的吗
df['sale_date'].diff().abs()/np.timedelta64(1,'D')).lt(50).ne(1).cumsum(),df['net_sale_price'].pct_change().lt(0.1).ne(1).cumsum()
?@ds_user您只需要np.timedelta64(1,'D'),这是将days对象转换为int