熊猫组日期

时间:2013-10-17 20:14:29

标签: python pandas group-by

我有一个包含事件的DataFrame。一个或多个事件可以在某个日期发生(因此日期不能是索引)。日期范围是几年。我想分组数年和数月,并计算类别值。日Thnx

in [12]: df = pd.read_excel('Pandas_Test.xls', 'sheet1')
In [13]: df
Out[13]:
    EventRefNr     DateOccurence      Type Category
0        86596    2010-01-02 00:00:00     3    Small
1        86779    2010-01-09 00:00:00    13   Medium
2        86780    2010-02-10 00:00:00     6    Small
3        86781    2010-02-09 00:00:00    17    Small
4        86898    2010-02-10 00:00:00     6    Small
5        86898    2010-02-11 00:00:00     6    Small
6        86902    2010-02-17 00:00:00     9    Small
7        86908    2010-02-19 00:00:00     3   Medium
8        86908    2010-03-05 00:00:00     3   Medium
9        86909    2010-03-06 00:00:00     8    Small
10       86930    2010-03-12 00:00:00    29    Small
11       86934    2010-03-16 00:00:00     9    Small
12       86940    2010-04-08 00:00:00     9     High
13       86941    2010-04-09 00:00:00    17    Small
14       86946    2010-04-14 00:00:00    10    Small
15       86950    2011-01-19 00:00:00    12    Small
16       86956    2011-01-24 00:00:00    13    Small
17       86959    2011-01-27 00:00:00    17    Small

我试过了:

df.groupby(df['DateOccurence'])

2 个答案:

答案 0 :(得分:6)

对于月份和年度的突破,我经常在数据框中添加额外的列,将日期分成每个部分:

df['year'] = [t.year for t in df.DateOccurence]
df['month'] = [t.month for t in df.DateOccurence]
df['day'] = [t.day for t in df.DateOccurence]

它增加了空间复杂性(向df添加列),但是比datetime索引更少时间复杂(对groupby的处理更少),但它真的取决于你。 datetime index是做大熊猫的方式。

按年,月,日分组后,您可以根据需要进行任何分组。

df.groupby['year','month'].Category.apply(pd.value_counts)

多年来的几个月:

df.groupby['month'].Category.apply(pd.value_counts)

或者在Andy Hayden的日期时间指数

df.groupby[di.month].Category.apply(pd.value_counts)

您可以选择更适合您需求的方法。

答案 1 :(得分:4)

您可以将value_counts应用于SeriesGroupby(对于列):

In [11]: g = df.groupby('DateOccurence')

In [12]: g.Category.apply(pd.value_counts)
Out[12]: 
DateOccurence        
2010-01-02     Small     1
2010-01-09     Medium    1
2010-02-09     Small     1
2010-02-10     Small     2
2010-02-11     Small     1
2010-02-17     Small     1
2010-02-19     Medium    1
2010-03-05     Medium    1
2010-03-06     Small     1
2010-03-12     Small     1
2010-03-16     Small     1
2010-04-08     High      1
2010-04-09     Small     1
2010-04-14     Small     1
2011-01-19     Small     1
2011-01-24     Small     1
2011-01-27     Small     1
dtype: int64

我实际上希望这会返回以下DataFrame,但您需要unstack

In [13]: g.Category.apply(pd.value_counts).unstack(-1).fillna(0)
Out[13]: 
               High  Medium  Small
DateOccurence                     
2010-01-02        0       0      1
2010-01-09        0       1      0
2010-02-09        0       0      1
2010-02-10        0       0      2
2010-02-11        0       0      1
2010-02-17        0       0      1
2010-02-19        0       1      0
2010-03-05        0       1      0
2010-03-06        0       0      1
2010-03-12        0       0      1
2010-03-16        0       0      1
2010-04-08        1       0      0
2010-04-09        0       0      1
2010-04-14        0       0      1
2011-01-19        0       0      1
2011-01-24        0       0      1
2011-01-27        0       0      1

如果有多个不同的类别具有相同的日期,则它们将位于同一行...

相关问题