【问题标题】:How to apply groupby function to get previuos month count?如何按功能应用分组以获取上个月的计数?
【发布时间】:2018-02-22 06:25:00
【问题描述】:

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

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

【问题讨论】:

  • @JohnGalt- 好的,谢谢

标签: python pandas dataframe pandas-groupby


【解决方案1】:

因为month 已经排序。在sym 组上使用shift()fillna(0)

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

【讨论】:

  • @JohnGalt-您能否详细解释一下它是如何考虑 shift() 的日期的。我没有正确理解。
猜你喜欢
  • 2021-11-08
  • 1970-01-01
  • 1970-01-01
  • 2017-07-26
  • 2023-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多