Python 如何获得每组每小时的平均绝对频率?
我有以下数据帧:Python 如何获得每组每小时的平均绝对频率?,python,pandas,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
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处有2个条目,日期2017-04-01
在18处有1个条目。因此FREQ
等于1.5
,表示HOUR
=18和ID
=1
我有此代码,但未正确创建结果
:
df["Hour"] = df["Datetimr"].apply(lambda x: x.hour)
result = df.groupby(["Id","Hour"]).agg({'Hour':'size'}).reset_index()
试试这个
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
试试这个
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
使用:
使用:
根据您的代码,有三个
18
实例,您的问题也没有意义,您如何获得1.5
@dmitrypoloskiy:ID等于1,2017-03-02有两个18实例,2017-04-01有一个实例。那么,2和1的平均值是1.5,不是吗?@Dmitrypoloskiy:想象一下,今天在18:00到19:00之间有10名访客,而昨天在同一时间段有5名访客。那么,这两天的平均参观人数是多少(10+5)/2=15/2=7.5
根据您的代码,有三个18
实例,而且您的问题也没有意义,您如何获得1.5
@DmitryColonskiy:ID等于1,2017-03-02有两个18实例,2017-04-01有一个实例。那么,2和1的平均值是1.5,不是吗?@Dmitrypoloskiy:想象一下,今天在18:00到19:00之间有10名访客,而昨天在同一时间段有5名访客。那么,这两天的平均参观人数是多少<代码>(10+5)/2=15/2=7.5计数应在数天内取平均值。我不需要估计在所有的日子里总共有18个人。我想知道每天每小时的平均计数。想象一下,今天在18:00到19:00之间有10位访客,而昨天在同一时间段内有5位访客。那么,这两天的平均参观人数是多少<代码>(10+5)/2=15/2=7.5我理解为什么(1,18)的频率是1.5。但是为什么(1,19)得到2呢?你在这方面是完全正确的。(1,19)等于1。很抱歉。希望所有疑问现在都澄清。仍然缺少一行…1200
Aha。见第二个答案。他明白了。计数应该是几天的平均值。我不需要估计在所有的日子里总共有18个人。我想知道每天每小时的平均计数。想象一下,今天在18:00到19:00之间有10位访客,而昨天在同一时间段内有5位访客。那么,这两天的平均参观人数是多少<代码>(10+5)/2=15/2=7.5我理解为什么(1,18)的频率是1.5。但是为什么(1,19)得到2呢?你在这方面是完全正确的。(1,19)等于1。很抱歉。希望所有疑问现在都澄清。仍然缺少一行…1200
Aha。见第二个答案。他明白了。在我的数据框中,Datetime
的类型是datetime64[ns]
。如果我执行df[“Datetime”].apply(lambda x:x.date)
然后打印值,我会看到类似的内容,我正在使用您的示例数据,如果您能提供更多信息,我们可以尝试帮助您。或者您可以使用这个..df.Datetime.astype(str).str[0:10]
要获取我的数据框中的日期
,其类型为datetime64[ns]
。如果我执行df[“Datetime”].apply(lambda x:x.date)
然后打印值,我会看到类似的内容,我正在使用您的示例数据,如果您能提供更多信息,我们可以尝试帮助您。或者您可以使用这个..df.Datetime.astype(str).str[0:10]
来获取日期
#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