为列B中的每个唯一值获取列A中的唯一值列表

2024-09-26 17:50:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我发现这个问题很容易写出来,但很难应用于我的熊猫数据帧。 当搜索任何“唯一值”和“列表”时,我只得到在列表中获取唯一值的答案。你知道吗

有一个具有双for循环的蛮力解,但必须有一个比n^2更快的解。你知道吗

我有一个包含两列的数据框:Name和Likes Food。你知道吗

作为输出,我希望为每个唯一名称提供一个独特的Likes食物值列表。你知道吗

数据帧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]


Tags: 数据name名称df列表indexfoodjohn
2条回答

要同时对这两列进行排序,请尝试以下操作:

df = df.groupby("Name")["Likes_Food"].aggregate({'counts': 'nunique',
                                            'food_list': 'unique'}).reset_index().sort_values(by='counts', ascending=False)
df
   Name  counts               food_list
3    Tim       3   [Pizza, Pasta, Sushi]
0    Amy       2  [Pizza, SweetPotatoes]
2  Marie       2          [Pizza, Sushi]
1   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]

相关问题 更多 >

    热门问题