熊猫:计算每个用户每天的平均行数

时间:2016-06-01 14:41:44

标签: python pandas

我有一个Pandas DataFrame,其中包含DATE列和userid列,如下所示:

    userid      DATE
0   vDKE27PF6z  2016-05-26
1   z6XJewg04Y  2016-05-25
2   e5Fsyak59l  2016-05-25
3   7SaYpGRtMI  2016-05-25
4   KGmTH0XOMz  2016-05-25

有许多不同的DATE值,对于每个DATE,特定的userid可以出现两次。对于每个日期,我想计算与DATE对应的行数除以为给定userid显示的唯一DATE值的数量。最好的方法是什么?我已经尝试了groupby的各种排列,但这些排列并没有达到我想要的位置。

4 个答案:

答案 0 :(得分:2)

df.groupby('DATE')['userid'].agg(lambda x:x.nunique()*1.0/x.count())
如果没有*1.0

,python3中的

就可以了

答案 1 :(得分:2)

你应该可以这样做:

df = pd.DataFrame({"userid": ["vDKE27PF6z",  "vDKE27PF6z", "e5Fsyak59l", "7SaYpGRtMI", "KGmTH0XOMz"  ], "DATE" : ["2016-05-25","2016-05-25","2016-05-25","2016-05-25","2016-05-26"]})

dates = df.groupby("DATE").count() # Number of occurrences of each date
dates["uniques"] = df.groupby("DATE").userid.nunique() # Number of unique users per day
dates["ratio"] = dates.userid/dates.uniques # Ratio of the two

答案 2 :(得分:0)

pd.groupby是要走的路。我想你正在寻找describe()功能。它提供了有关DataFrame的简单统计信息。

data = pd.DataFrame({'userid':['vDKE27PF6z', 'z6XJewg04Y', 
                               'e5Fsyak59l', '7SaYpGRtMI', 'KGmTH0XOMz'],
                     'DATE': ['2016-05-26', '2016-05-25', 
                              '2016-05-25', '2016-05-25', '2016-05-25']})

for ind, grp in data.groupby('DATE'):
    print(grp.describe())

输出是pd.DataFrame对象,该对象具有该组中对象数量的count,以及该组中unique个对象的数量。以下示例输出:

>>>              DATE      userid
   count            4           4
   unique           1           4
   top     2016-05-25  7SaYpGRtMI
   freq             4           1

>>>              DATE      userid
   count            1           1
   unique           1           1
   top     2016-05-26  vDKE27PF6z
   freq             1           1

日期'2016-05-25'的通知,有一个唯一的日期(当然)和4个唯一的用户ID。有关describe()功能的更多信息,请访问:http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.describe.html

答案 3 :(得分:0)

假设你有

df
    userid  DATE
0   vDKE27PF6z  2016-05-26
1   z6XJewg04Y  2016-05-25
2   e5Fsyak59l  2016-05-25
3   7SaYpGRtMI  2016-05-25
4   KGmTH0XOMz  2016-05-25

然后你可以按照以下步骤进行:

df.groupby('DATE',as_index=False).agg(lambda x: 1/len(np.unique(x)))
          DATE  userid
0   2016-05-25  0.25
1   2016-05-26  1.00