如何获得每组的每小时平均绝对频率?

时间:2017-07-03 13:47:05

标签: python pandas

我有以下数据框:

df =
    Id         Datetime
    1          2017-03-02 18:06:20
    1          2017-03-02 18:05:10
    1          2017-04-01 18:04:09
    1          2017-03-02 19:06:50
    1          2017-04-01 19:07:22
    2          2017-03-03 18:09:15
    2          2017-05-03 19:07:05
    2          2017-05-03 20:19:08

我想知道每个ID每小时的平均绝对频率。换句话说,我需要计算每小时ID的绝对频率,平均为几天和几个月。预期的结果是这一个:

ID   HOUR   FREQ
1    18     1.5
1    19     1
1    20     0
2    18     1
2    19     1
2    20     1

例如,如果ID等于1,则日期2017-03-02的18个条目为18,日期2017-04-01的条目为18的条目。因此,对于FREQ = 18和1.5 = 1,HOUR等于ID

我有这段代码,但result无法正确创建:

df["Hour"] = df["Datetimr"].apply(lambda x: x.hour)
result = df.groupby(["Id","Hour"]).agg({'Hour':'size'}).reset_index()

3 个答案:

答案 0 :(得分:1)

试试这个。

df["Hour"] = pd.to_datetime(df.Datetime).dt.hour
df['Date'] = pd.to_datetime(df.Datetime).dt.date
df1=df.groupby(["Id","Hour","Date"]).size().reset_index()
df2=df1.groupby(["Id","Hour"])[0].mean().unstack('Hour').stack('Hour', dropna=False).reset_index()
df2.fillna(0)


Out[265]: 
   Id  Hour    0
0   1    18  1.5
1   1    19  1.0
2   1    20  0.0
3   2    18  1.0
4   2    19  1.0
5   2    20  1.0

答案 1 :(得分:1)

使用:

#if necessary convert to datetime
df['Datetime'] = pd.to_datetime(df['Datetime'])

#groupby by column, by hours and by dates
df = df.groupby([df['ID'],  df['Datetime'].dt.hour,  df['Datetime'].dt.date]).size()
#groupby by ID and hours
df1 = df.groupby(level=[0,1]).mean()
#add missing values by reindex by Multiindex
mux = pd.MultiIndex.from_product([df1.index.levels[0], df1.index.levels[1]], 
                                 names=df1.index.names)
df1 = df1.reindex(mux, fill_value=0).reset_index(name='FREQ')
print (df1)
   ID  Datetime  FREQ
0   1        18   1.5
1   1        19   1.0
2   1        20   0.0
3   2        18   1.0
4   2        19   1.0
5   2        20   1.0

答案 2 :(得分:0)

df["Hour"] = df["Datetime"].apply(lambda x:x.hour)
df["month"] = df["Datetime"].apply(lambda x:x.month)
dfg = df.groupby(["Id","Hour"])
freq = dfg.size()/dfg["month"].unique().apply(lambda x:len(x))
result = freq.reset_index(name="FREQ")