如果将索引设置为日期时间,则可以使用pd.TimeGrouper按各种时间范围进行排序。示例代码:
# recreate dataframe
df = pd.DataFrame({'A': ['a', 'b', 'b', 'a', 'a'], 'B': ['2016-09-13', '2016-09-14', '2016-09-15',
'2016-10-13', '2016-10-14']})
df['B'] = pd.to_datetime(df['B'])
# set column B as index for use of TimeGrouper
df.set_index('B', inplace=True)
# Now do the magic of Ami Tavory's answer combined with timeGrouper:
df = df.groupby([pd.TimeGrouper('M'), 'A']).size().unstack().fillna(0)
这将返回:
A a b
B
2016-09-30 1.0 2.0
2016-10-31 2.0 0.0
或者可选地(学分艾汉)跳过设置索引步骤,并使用以下单行创建数据帧之后直:
# recreate dataframe
df = pd.DataFrame({'A': ['a', 'b', 'b', 'a', 'a'], 'B': ['2016-09-13', '2016-09-14', '2016-09-15',
'2016-10-13', '2016-10-14']})
df['B'] = pd.to_datetime(df['B'])
df = df.groupby([pd.Grouper(key='B', freq='M'), 'A']).size().unstack().fillna(0)
返回相同的答案
IIUC then then'df.groupby([df ['B']。dt.year,df ['B']。dt.day])['A']。size ()'应该工作 – EdChum
@EdChum首先,IINM,你的意思是'df.groupby([df.B.dt.year,df.A])。size()。unstack()';第二,它不起作用 - 它需要年份和月份的组合。 –
@AmiTavory @OmTavory @OPT提到他们希望'或者一般年复一日',所以我回答了这个问题,我没有测试我的代码片段,所以这是一个平底船 – EdChum