如何用唯一的行(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我在答案中添加了一个示例。