Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 根据唯一条目的数量按组计算比例_Python_Python 3.x_Pandas - Fatal编程技术网

Python 根据唯一条目的数量按组计算比例

Python 根据唯一条目的数量按组计算比例,python,python-3.x,pandas,Python,Python 3.x,Pandas,我有一些在特定时间点使用服务的已识别用户id。 我试图计算每天特定服务类型的用户比例。在这个示例数据中,我只有一天的时间,但是如果有更多的时间,我希望允许代码以相同的方式工作 day1 = datetime_idx type id 2016-03-01 05:04:00 C 1 2016-03-01 05:24:00 A 2 2016-03-01 05:29:00 C 3 2016-03-01 05:29:00

我有一些在特定时间点使用服务的已识别用户id。 我试图计算每天特定服务类型的用户比例。在这个示例数据中,我只有一天的时间,但是如果有更多的时间,我希望允许代码以相同的方式工作

day1 = 
datetime_idx            type  id
2016-03-01 05:04:00      C    1
2016-03-01 05:24:00      A    2
2016-03-01 05:29:00      C    3
2016-03-01 05:29:00      B    4
2016-03-01 05:35:00      D    1

day1_usage = day1.groupby('type').resample('D')['id'].nunique().reset_index()
这给了我以下信息:

     type datetime_idx   id
0    A     2016-03-01        1
1    B     2016-03-01        1
2    C     2016-03-01        2
3    D     2016-03-01        1
我试着用这种方法计算比例:

day1_usage['ratio'] = (day1_usage.groupby(['type','datetime_idx'])['id'].transform(sum) / day1_usage.groupby('datetime_idx')['id'].transform(sum))
这是我得到的输出:

   type    datetime_idx     id  ratio 
0    A     2016-03-01        1    0.2 
1    B     2016-03-01        1    0.2 
2    C     2016-03-01        2    0.4 
3    D     2016-03-01        1    0.2 
但我想得到的结果是:

   type    datetime_idx     id  ratio 
0    A     2016-03-01        1    0.25 
1    B     2016-03-01        1    0.25 
2    C     2016-03-01        2    0.5 
3    D     2016-03-01        1    0.25 
我的代码除以用户条目的总和,但我希望它除以唯一用户的数量。

您似乎需要:

看来你需要:


由于您已经计算了day1_使用情况数据框,因此计算也可以非常简单:

day1_usage['ratio'] = day1_usage.id / day1.id.nunique()
结果:

 type datetime_idx  id  ratio
0    A   2016-03-01   1   0.25
1    B   2016-03-01   1   0.25
2    C   2016-03-01   2   0.50
3    D   2016-03-01   1   0.25

由于您已经计算了day1_使用情况数据框,因此计算也可以非常简单:

day1_usage['ratio'] = day1_usage.id / day1.id.nunique()
结果:

 type datetime_idx  id  ratio
0    A   2016-03-01   1   0.25
1    B   2016-03-01   1   0.25
2    C   2016-03-01   2   0.50
3    D   2016-03-01   1   0.25
编辑 让我们试着用几天时间

csv_file = StringIO("""datetime_idx            type  id
2016-03-01 05:04:00      C    1
2016-03-01 05:24:00      A    2
2016-03-01 05:29:00      C    3
2016-03-01 05:29:00      B    4
2016-03-01 05:35:00      D    1
2016-03-03 05:04:00      C    1
2016-03-03 05:24:00      A    2
2016-03-03 05:29:00      C    3
2016-03-03 05:29:00      B    4
2016-03-03 05:35:00      D    1""")        

days = pd.read_csv(csv_file,sep='\s\s+')

days['datetime_idx'] = pd.to_datetime(days.datetime_idx)

days = days.set_index('datetime_idx')

print(days)

                    type  id
datetime_idx                
2016-03-01 05:04:00    C   1
2016-03-01 05:24:00    A   2
2016-03-01 05:29:00    C   3
2016-03-01 05:29:00    B   4
2016-03-01 05:35:00    D   1
2016-03-03 05:04:00    C   1
2016-03-03 05:24:00    A   2
2016-03-03 05:29:00    C   3
2016-03-03 05:29:00    B   4
2016-03-03 05:35:00    D   1

days_usage = days.groupby('type').resample('D')['id'].nunique().to_frame()

days_usage

                   id
type datetime_idx    
A    2016-03-01     1
     2016-03-02     0
     2016-03-03     1
B    2016-03-01     1
     2016-03-02     0
     2016-03-03     1
C    2016-03-01     2
     2016-03-02     0
     2016-03-03     2
D    2016-03-01     1
     2016-03-02     0
     2016-03-03     1

days_usage['ratio'] = (days_usage.unstack(0)
    .div(days.resample('D')['id'].nunique(), axis='index')).fillna(0).stack().swaplevel(0,1)

print(days_usage)
输出:

                      id  ratio
type datetime_idx           
A    2016-03-01     1   0.25
     2016-03-02     0   0.00
     2016-03-03     1   0.25
B    2016-03-01     1   0.25
     2016-03-02     0   0.00
     2016-03-03     1   0.25
C    2016-03-01     2   0.50
     2016-03-02     0   0.00
     2016-03-03     2   0.50
D    2016-03-01     1   0.25
     2016-03-02     0   0.00
     2016-03-03     1   0.25
编辑 让我们试着用几天时间

csv_file = StringIO("""datetime_idx            type  id
2016-03-01 05:04:00      C    1
2016-03-01 05:24:00      A    2
2016-03-01 05:29:00      C    3
2016-03-01 05:29:00      B    4
2016-03-01 05:35:00      D    1
2016-03-03 05:04:00      C    1
2016-03-03 05:24:00      A    2
2016-03-03 05:29:00      C    3
2016-03-03 05:29:00      B    4
2016-03-03 05:35:00      D    1""")        

days = pd.read_csv(csv_file,sep='\s\s+')

days['datetime_idx'] = pd.to_datetime(days.datetime_idx)

days = days.set_index('datetime_idx')

print(days)

                    type  id
datetime_idx                
2016-03-01 05:04:00    C   1
2016-03-01 05:24:00    A   2
2016-03-01 05:29:00    C   3
2016-03-01 05:29:00    B   4
2016-03-01 05:35:00    D   1
2016-03-03 05:04:00    C   1
2016-03-03 05:24:00    A   2
2016-03-03 05:29:00    C   3
2016-03-03 05:29:00    B   4
2016-03-03 05:35:00    D   1

days_usage = days.groupby('type').resample('D')['id'].nunique().to_frame()

days_usage

                   id
type datetime_idx    
A    2016-03-01     1
     2016-03-02     0
     2016-03-03     1
B    2016-03-01     1
     2016-03-02     0
     2016-03-03     1
C    2016-03-01     2
     2016-03-02     0
     2016-03-03     2
D    2016-03-01     1
     2016-03-02     0
     2016-03-03     1

days_usage['ratio'] = (days_usage.unstack(0)
    .div(days.resample('D')['id'].nunique(), axis='index')).fillna(0).stack().swaplevel(0,1)

print(days_usage)
输出:

                      id  ratio
type datetime_idx           
A    2016-03-01     1   0.25
     2016-03-02     0   0.00
     2016-03-03     1   0.25
B    2016-03-01     1   0.25
     2016-03-02     0   0.00
     2016-03-03     1   0.25
C    2016-03-01     2   0.50
     2016-03-02     0   0.00
     2016-03-03     2   0.50
D    2016-03-01     1   0.25
     2016-03-02     0   0.00
     2016-03-03     1   0.25


它的简单性很好,但似乎每天都在计算唯一的ID,而不是按天计算。示例数据只有一个日期,这就是为什么它似乎可以工作的原因。它的简单性很好,但它似乎是计算所有天中的唯一ID,而不是按天计算。示例数据只有一个日期,所以这就是为什么它似乎有效的原因。我有点困惑。分母似乎是在对唯一ID进行计数之后对其进行计数,因为数据帧是day1_用法。我如何从dataframe day1开始计算呢?它似乎只起作用,因为day1_使用中的条目数恰好是4,对吗?并不是说那一天唯一用户的数量是4。@Helk-有可能添加更多具有所需输出的数据吗?尽管它似乎在这里起作用。我有点困惑。分母似乎是在对唯一ID进行计数之后对其进行计数,因为数据帧是day1_用法。我如何从dataframe day1开始计算呢?它似乎只起作用,因为day1_使用中的条目数恰好是4,对吗?并不是说当天的唯一用户数是4。@Helk-是否可以添加更多具有所需输出的数据?size似乎不是计算唯一ID数的正确函数。现在,在尝试将答案应用于更大的数据集之后,我注意到“大小”实际上是计算类型的数量,因为我们按类型分组,而不是按当天唯一用户的数量。每天唯一的ID数量需要从原始数据帧“day1”中获取@Helk我有几个小时的时间重置并再次思考这个问题。让我们看看这个逻辑是否符合你想要的。@Helk这是个很酷的问题。为了得到你想要的结果,我不得不稍微改变一下形状。如果你不遵循逻辑,请告诉我。我想我理解了这个过程,并且用你的答案学习了几个新命令:swaplevel和to_frame。感谢againsize似乎不是计算唯一ID数的正确函数。现在,在尝试将答案应用于更大的数据集之后,我注意到“大小”实际上是计算类型的数量,因为我们按类型分组,而不是按当天唯一用户的数量。每天唯一的ID数量需要从原始数据帧“day1”中获取@Helk我有几个小时的时间重置并再次思考这个问题。让我们看看这个逻辑是否符合你想要的。@Helk这是个很酷的问题。为了得到你想要的结果,我不得不稍微改变一下形状。如果你不遵循逻辑,请告诉我。我想我理解了这个过程,并且用你的答案学习了几个新命令:swaplevel和to_frame。再次谢谢,问题其实还没解决,好的。如何计算比率?第1天x类型的比率=第1天x类型的唯一用户数/第1天的唯一用户数对于实例,这将给出每天的唯一用户数:第1天。重新采样'D'['id']。nunique.reset_index。我只是不知道如何让这个部门运作。@ScottBoston你能帮忙吗?问题其实还没解决。如何计算比率?第1天x类型的比率=第1天x类型的唯一用户数/第1天的唯一用户数对于实例,这将给出每天的唯一用户数:第1天。重新采样'D'['id']。nunique.reset_index。“我只是不知道如何让这个部门运作。”斯科特伯顿,你能帮忙吗?