Pandas groupby日期月份和计数项目在几个月内

时间:2017-11-22 12:51:42

标签: python pandas

我有一个这样的数据框:

Month | Item | Count
1     | A    | 2
      | B    | 2
      | C    | 1
2     | A    | 1
      | B    | 1

我试图按月分组,并在一个月内计算,结果必须如下:

lastyear_df.groupby([(df['INVOICE_DATE2']).dt.month, df['STYLE']])['STYLE'].count()

我试过这个:


@Suite.SuiteClasses({testA.class, testB.class, testC.class, testB.class})

但它对我没用。

2 个答案:

答案 0 :(得分:3)

这是一个班轮......

ans = df.groupby([df.INVOICE_DATE2.apply(lambda x: x.month), 'STYLE']).count()

这是输出

In [21]: ans
Out[21]:
                     INVOICE_DATE2
INVOICE_DATE2 STYLE
1             A                  2
              B                  2
              C                  1
2             A                  1
              B                  1

注意:此时您有一个分层索引,可以使用reset_index

来展平
ans = ans.reset_index(1)
              STYLE  INVOICE_DATE2
INVOICE_DATE2
1                 A              2
1                 B              2
1                 C              1
2                 A              1
2                 B              1

如果您愿意,现在可以更改列名和索引名称:

ans.index.name = 'MONTH'
ans.columns = ['ITEM', 'COUNT']

答案 1 :(得分:2)

我认为你很接近,如果想要计算size s:

,则需要NaN
d = {'INVOICE_DATE2':'Month','STYLE':'Item'}
df = (df.groupby([df['INVOICE_DATE2'].dt.month, 'STYLE'])
       .size()
       .reset_index(name='Count')
       .rename(columns=d))
print (df)
   Month Item  Count
0      1    A      2
1      1    B      2
2      1    C      1
3      2    A      1
4      2    B      1

count countNaN s:

d = {'INVOICE_DATE2':'Month','STYLE':'Item'}
df = (df.groupby([df['INVOICE_DATE2'].dt.month, 'STYLE'])['STYLE']
       .count()
       .reset_index(name='Count')
       .rename(columns=d))
print (df)
   Month Item  Count
0      1    A      2
1      1    B      2
2      1    C      1
3      2    A      1
4      2    B      1

最后如果在第一列中只需要一个唯一值:

df['Month'] = df['Month'].mask(df.duplicated('Month'),'')
print (df)
  Month Item  Count
0     1    A      2
1          B      2
2          C      1
3     2    A      1
4          B      1