我正在尝试使用cumsum()和cumcount()在pandas DataFrame中创建句点。如何为每本书创建时段?
期间-连续的每周顺序。 例如,如果(周)-(前一周)> 1 =>新期间。
对于discount_weeks来说,它的工作原理如下:
df['discount_weeks']=df.groupby(
['book_id', df['week_id'].diff().ne(1).cumsum()]).cumcount()
我尝试过
df['discount_periods']=df.groupby(
['book_id', df['discount_weeks'].diff().ne(1).cumsum()]).cumcount()
但这不起作用
最后,它应该看起来像这样:
book_id week_id discount_weeks total discount_periods
0 1 99 0 149 1
1 1 100 1 149 1
2 1 102 0 150 2
3 1 103 1 150 2
4 2 104 0 151 1
5 2 105 1 151 1
6 2 106 2 151 1
7 3 100 0 152 1
8 3 101 1 152 1
9 4 102 0 153 1
10 4 104 0 154 2
为每个book_id计算折扣期的地方
答案 0 :(得分:1)
简单地按['book_id','discount_weeks']
分组,然后加入cumcount
:
df['discount_periods'] = df.groupby(['book_id','discount_weeks']).cumcount()+1
(请勿按df['discount_weeks'].diff().ne(1).cumsum()
分组。)
import pandas as pd
df = pd.DataFrame({'book_id': [1, 1, 1, 1, 2, 2, 2, 3, 3, 4, 4],
'week_id': [99, 100, 102, 103, 104, 105, 106, 100, 101, 102, 104],
'total': [149, 149, 150, 150, 151, 151, 151, 152, 152, 153, 154],})
df['groupnum'] = df['week_id'].diff().ne(1).cumsum()
df['discount_weeks'] = df.groupby(['book_id', 'groupnum']).cumcount()
df['discount_periods'] = df.groupby(['book_id','discount_weeks']).cumcount()+1
cols = ['book_id', 'groupnum', 'week_id', 'discount_weeks', 'total', 'discount_periods',]
df = df[cols]
print(df)
收益
book_id groupnum week_id discount_weeks total discount_periods
0 1 1 99 0 149 1
1 1 1 100 1 149 1
2 1 2 102 0 150 2
3 1 2 103 1 150 2
4 2 2 104 0 151 1
5 2 2 105 1 151 1
6 2 2 106 2 151 1
7 3 3 100 0 152 1
8 3 3 101 1 152 1
9 4 3 102 0 153 1
10 4 4 104 0 154 2
一种解决方法是将行分为几组,以显示
discount_periods
中所需的顺序(类似于累积)模式:
book_id groupnum week_id discount_weeks total discount_periods
0 1 1 99 0 149 1
2 1 2 102 0 150 2
1 1 1 100 1 149 1
3 1 2 103 1 150 2
4 2 2 104 0 151 1
5 2 2 105 1 151 1
6 2 2 106 2 151 1
7 3 3 100 0 152 1
8 3 3 101 1 152 1
9 4 3 102 0 153 1
10 4 4 104 0 154 2
现在查找共享每个组唯一的公共值的列。在这
情况下,book_id
,discount_weeks
符合要求。如果没有这样的列或集合
列定义所需的组,那么您当然需要定义
一些新的数量来捕捉“群体”的概念。但无论如何,将
行,并尝试查找其值定义唯一组的列应为
一种有效的开始方式。