如何使用熊猫在dataFrame中创建句点?

时间:2019-06-01 14:40:38

标签: python pandas

我正在尝试使用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计算折扣期的地方

1 个答案:

答案 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_iddiscount_weeks符合要求。如果没有这样的列或集合 列定义所需的组,那么您当然需要定义 一些新的数量来捕捉“群体”的概念。但无论如何,将 行,并尝试查找其值定义唯一组的列应为 一种有效的开始方式。