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

时间:2019-11-14 13:52:08

标签: python pandas list sorting dataframe

我发现此问题易于写出,但很难与我的Pandas Dataframe一起使用。 当搜索任何“唯一值”和“列表”时,我只会得到在列表中获得唯一值的答案。

有一个带有双重for循环的蛮力解决方案,但必须有比n ^ 2更快的Pandas解决方案。

我有一个包含两列的DataFrame:Name和Likes Food。

作为输出,我想要每个唯一名称的唯一Likes Food值列表

示例数据框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

我知道如何汇总和分组Likes Food的唯一计数:

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

但是鉴于此,该DataFrame中每个名称的含义是什么?为了提高可读性,用列表表示很有意义。列表排序无关紧要(并且很容易修复)。

示例输出

<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]

2 个答案:

答案 0 :(得分:1)

要获得无计数的输出,只需尝试unique

invite_code

此外,您可以使用named aggregation

temp = df.holiday.iloc[::-1].eq(1).cumsum()   
df['next_holiday'] = temp.groupby(temp).cumcount()

答案 1 :(得分:1)

要同时获得两列也进行排序,请尝试以下操作:

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]