如何用唯一的行(Python)表示每个用户?

如何用唯一的行(Python)表示每个用户?,python,pandas,Python,Pandas,我有这样的数据: UserId Date Part_of_day Apps Category Frequency Duration_ToT 1 2020-09-10 evening Settings System tool 1 3.436 1 2020-09-11 afternoon Calendar Calendar 5 9.965 1 20

我有这样的数据:

UserId  Date    Part_of_day    Apps         Category   Frequency      Duration_ToT
1   2020-09-10  evening    Settings     System tool        1          3.436
1   2020-09-11  afternoon   Calendar    Calendar           5          9.965
1   2020-09-11  afternoon   Contacts    Phone_and_SMS      7          2.606
2   2020-09-11  afternoon   Facebook    Social             15         50.799
2   2020-09-11  afternoon   clock       System tool        2          5.223
3   2020-11-18  morning    Contacts    Phone_and_SMS       3          1.726
3   2020-11-18  morning     Google    Productivity         1          4.147
3   2020-11-18  morning    Instagram    Social             1          0.501
.......................................
67  2020-11-18  morning    Truecaller   Communication     1          1.246
67  2020-11-18  night      Instagram    Social            3          58.02
我正试图减少我的数据帧的死亡性,以设置k-means的条目。 我想问一下,是否可以用一行来表示每个用户?你觉得这有什么关系?
我怎么办。我找不到任何解决方案

这取决于您希望如何聚合值。下面是一个如何使用
groupby
agg
的小示例

首先,我创建一些示例数据

import pandas as pd
import random

df = pd.DataFrame({
   "id":   [int(i/3) for i in range(20)], 
   "val1": [random.random() for _ in range(20)], 
   "val2": [str(int(random.random()*100)) for _ in range(20)]
})
>>> df.head()
   id      val1 val2
0   0  0.174553   49
1   0  0.724547   95
2   0  0.369883    3
3   1  0.243191   64
4   1  0.575982   16
>>> df.dtypes
id        int64
val1    float64
val2     object
dtype: object
然后,我们根据id分组,并根据传递给
agg
的字典中指定的函数聚合值。在本例中,我对浮点值求和,并用下划线分隔符连接字符串。例如,您还可以传递list函数以将值存储在列表中

>>> df.groupby("id").agg({"val1": sum, "val2": "__".join})
        val1        val2
id
0   1.268984   49__95__3
1   0.856992  64__16__54
2   2.186370  30__59__21
3   1.486925  29__47__77
4   1.523898  19__78__99
5   0.855413  59__74__73
6   0.201787      63__33
编辑注释“但是我们如何根据应用程序的持续时间使val2包含前5个应用程序?”:

agg
方法受到限制,因为在聚合时不能访问其他属性。为此,应使用
apply
方法。您向它传递一个函数,该函数处理整个组并返回一行作为
Series
对象

在本例中,我仍然使用val1的和,但对于val2,我返回val1最高的行的val2。这应该清楚地说明如何使聚合依赖于其他属性

def apply_func(group):
   return pd.Series({
      "id": group["id"].iat[0], 
      "val1": group["val1"].sum(), 
      "val2": group["val2"].iat[group["val1"].argmax()]
   })

>>> df.groupby("id").apply(apply_func)
    id      val1 val2
id
0    0  1.749955   95
1    1  0.344372   65
2    2  2.019035   70
3    3  2.444691   36
4    4  2.573576   92
5    5  1.453769   72
6    6  1.811516   94

请张贴您的预期输出。我不知道输出谢谢!但是,我们如何才能根据应用程序的持续时间使val2包含前5个应用程序?@ab20225我在答案中添加了一个示例。