我有一个数据框,B列的dtype是datetime64。
A B
0 a 2016-09-13
1 b 2016-09-14
2 b 2016-09-15
3 a 2016-10-13
4 a 2016-10-14
我想根据月份(或一般年份和日期......)进行分组。
所以我想在下面得到计数结果,key = B列。
a b
2016-09 1 2
2016-10 2 0
我尝试过groupby。但我无法弄清楚如何处理像datetime64这样的dtypes ... 如何处理和分组dtype datetime64?
答案 0 :(得分:4)
如果将索引设置为日期时间,则可以使用pd.TimeGrouper按各种时间范围进行排序。示例代码:
Select '1' as "Test" , (CASE WHEN (True) Then '2' ELSE '3' END) as Two/Three.
返回:
# 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)
或者替代(ayhan的信用)跳过设置索引步骤并在创建数据帧后直接使用以下单行:
A a b
B
2016-09-30 1.0 2.0
2016-10-31 2.0 0.0
返回相同的答案
答案 1 :(得分:3)
假设您从
开始In [247]: 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']})
In [248]: df.B = pd.to_datetime(df.B)
然后您可以groupby
- size
,然后unstack
:
In [249]: df = df.groupby([df.B.dt.year.astype(str) + '-' + df.B.dt.month.astype(str), df.A]).size().unstack().fillna(0).astype(int)
最后,您只需要再次B
日期:
In [250]: df.index = pd.to_datetime(df.index)
In [251]: df
Out[251]:
A a b
B
2016-10-01 2 0
2016-09-01 1 2
请注意,最终转换为日期时间设置为统一日(您不能拥有此类型的“无天花板”对象)。