如何应用groupby函数获取previuos月数?

时间:2017-09-13 13:45:15

标签: python pandas dataframe pandas-groupby

我有一个如下所示的数据框:

dff = pd.DataFrame({'month': ['1','1','1','1','2','2','2','2','3','3'],
            'sym': ['abc','pqr','xyz','lmn','abc','pqr','xyz','lmn','aaa','bbb'],
        'count': ['10','14','25','20','34','23','43','34','10','20']})

dff = dff[['sym','month','count']]
print dff

  sym month count
0  abc     1    10
1  pqr     1    14
2  xyz     1    25
3  lmn     1    20
4  abc     2    34
5  pqr     2    23
6  xyz     2    43
7  lmn     2    34
8  aaa     3    10
9  bbb     3    20

我想为此数据框创建名为“prev_count”的新列。要创建此新列“prev_count”,需要遵循以下规则:

  • 如果特定组中没有上个月,则“prev_count”值应为0.
  • 如果特定组中的上个月可用,则上个月的计数值应为“prev_count”的值。

我尝试使用groupby函数,如下所示:

def f(df):

   print df
   return ""

dff['pre_count'] = dff.groupby('sym').apply(f)

但是我无法理解如何保持上个月的跟踪计数值。他们的任何大熊猫是否可以对数据进行此类操作?

预期输出:

  sym month count    prev_count
0  abc     1    10   0
1  pqr     1    14   0
2  xyz     1    25   0
3  lmn     1    20   0
4  abc     2    34   10
5  pqr     2    23   14
6  xyz     2    43   25
7  lmn     2    34   20
8  aaa     3    10   0
9  bbb     3    20   0

1 个答案:

答案 0 :(得分:1)

由于month已经排序。在shift()群组

上使用fillna(0)sym
In [2878]: dff['prev_count'] = dff.groupby('sym')['count'].shift().fillna(0)

In [2879]: dff
Out[2879]:
   sym month count prev_count
0  abc     1    10          0
1  pqr     1    14          0
2  xyz     1    25          0
3  lmn     1    20          0
4  abc     2    34         10
5  pqr     2    23         14
6  xyz     2    43         25
7  lmn     2    34         20
8  aaa     3    10          0
9  bbb     3    20          0

或者,transform

In [2880]: dff.groupby('sym')['count'].transform(lambda x: x.shift(1)).fillna(0)
Out[2880]:
0     0
1     0
2     0
3     0
4    10
5    14
6    25
7    20
8     0
9     0
Name: count, dtype: object