pandas 分组数据框 - python
pandas grouping data frame - python
我有这个数据集,
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
如何在 pandas 中实现此目的,有人可以帮忙吗?谢谢
我们可以在sort_values
之后使用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
我有这个数据集,
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
如何在 pandas 中实现此目的,有人可以帮忙吗?谢谢
我们可以在sort_values
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