我有以下数据框:
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()
答案 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")