Python 熊猫按日期月份分组,并在月份内计数项目

Python 熊猫按日期月份分组,并在月份内计数项目,python,pandas,Python,Pandas,我有这样一个数据帧: STYLE | INVOICE_DATE2 A | 2017-01-03 B | 2017-01-03 C | 2017-01-03 A | 2017-02-03 A | 2017-01-03 B | 2017-02-03 B | 2017-01-03 Month | Item | Count 1 | A | 2 | B | 2 | C | 1 2 | A

我有这样一个数据帧:

STYLE | INVOICE_DATE2
A     | 2017-01-03
B     | 2017-01-03
C     | 2017-01-03
A     | 2017-02-03
A     | 2017-01-03
B     | 2017-02-03
B     | 2017-01-03
Month | Item | Count
1     | A    | 2
      | B    | 2
      | C    | 1
2     | A    | 1
      | B    | 1
我试着按月对它们进行分组,并在一个月内进行计数,结果必须如下所示:

STYLE | INVOICE_DATE2
A     | 2017-01-03
B     | 2017-01-03
C     | 2017-01-03
A     | 2017-02-03
A     | 2017-01-03
B     | 2017-02-03
B     | 2017-01-03
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()

但这对我不起作用。

我想你很接近了,需要
尺寸
如果想要计数
NaN
s:

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
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
count
对于
count
仅无
NaN
s:

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
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

我想你们很接近了,需要
size
如果想要计数
NaN
s:

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
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
count
对于
count
仅无
NaN
s:

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
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
这是一条单行线

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\u 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']
这是一条单行线

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\u 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']

耶斯雷尔谢谢,它能用,我正在等待批准,顺便问一下,我们能在几个月内订货吗?谢谢如果我做:排序(按=['Count'],升序=False)它会打断月列我想你需要
df。排序(按=['month','Count'],升序=[True,False])
?不,它不起作用,我的意思是每个月的订单数量从最大到最小。排序(按=['month','Count'],升序=[True,False])jezrael谢谢,它有效,我正在等待批准,顺便问一下,我们能在几个月内订购吗?谢谢如果我做:排序(按=['Count'],升序=False)它会打断月列我想你需要
df。排序(按=['month','Count'],升序=[True,False])
?不,它不起作用,我的意思是每个月的订单数量从最大到最小。排序(按=['month','Count'],升序=[True,False])