我发现这个问题很容易写出来,但很难用我的 Pandas Dataframe 来应用。 当搜索任何“唯一值”和“列表”时,我只能得到获取列表中唯一值的答案。
有一个带有双 for 循环的强力解决方案,但一定有比 n^2 更快的 Pandas 解决方案。
我有一个包含两列的数据框:名称和喜欢的食物。
作为输出,我想要每个唯一名称的唯一喜欢食物值列表。
示例数据框 df
Index Name Likes Food
0 Tim Pizza
1 Marie Pizza
2 Tim Pasta
3 Tim Pizza
4 John Pizza
5 Amy Pizza
6 Amy Sweet Potatoes
7 Marie Sushi
8 Tim Sushi
我知道如何根据“喜欢食物”的唯一计数进行聚合和分组:
df.groupby( by='Name', as_index=False ).agg( {'Likes Food': pandas.Series.nunique} )
df.sort_values(by='Likes Food', ascending=False)
df.reset_index( drop=True )
>>>
Index Name Likes Food
0 Tim 3
1 Marie 2
2 Amy 2
3 John 1
但是考虑到这一点,该数据框中每个名称的食物是什么?为了可读性,以列表的形式表达是很有意义的。列表排序并不重要(并且可能很容易修复)。
示例输出
<code here>
>>>
Index Name Likes Food Food List
0 Tim 3 [Pizza, Pasta, Sushi]
1 Marie 2 [Pizza, Sushi]
2 Amy 2 [Pizza, Sweet Potatoes]
3 John 1 [Pizza]
最佳答案
要获得没有计数的输出,只需尝试 unique
df.groupby("Name")["Likes"].unique()
Name
Amy [Pizza, Sweet Potatoes]
John [Pizza]
Marie [Pizza, Sushi]
Tim [Pizza, Pasta, Sushi]
Name: Likes, dtype: object
此外,您还可以使用named aggregation
df.groupby("Name").agg(**{"Likes Food": pd.NamedAgg(column='Likes', aggfunc="size"),
"Food List": pd.NamedAgg(column='Likes', aggfunc="nunique")}).reset_index()
Name Likes Food Food List
0 Amy 2 [Pizza, Sweet Potatoes]
1 John 1 [Pizza]
2 Marie 2 [Pizza, Sushi]
3 Tim 3 [Pizza, Pasta, Sushi]
关于python - Pandas 获取 A 列中 B 列中每个唯一值的唯一值列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58858374/