我发现此问题易于写出,但很难与我的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]
答案 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]