Python 对于B列中的每个唯一值,可以获取A列中的唯一值列表
我发现这个问题很容易写出来,但很难应用到我的熊猫数据框架中。 当搜索任何“唯一值”和“列表”时,我只得到在列表中获取唯一值的答案 有一个具有双for循环的蛮力解决方案,但必须有一个比n^2更快的解决方案 我有一个包含两列的数据框:Name和Likes Food 作为输出,我希望为每个唯一的名称提供一个独特的食物值列表 数据帧df示例Python 对于B列中的每个唯一值,可以获取A列中的唯一值列表,python,pandas,list,sorting,dataframe,Python,Pandas,List,Sorting,Dataframe,我发现这个问题很容易写出来,但很难应用到我的熊猫数据框架中。 当搜索任何“唯一值”和“列表”时,我只得到在列表中获取唯一值的答案 有一个具有双for循环的蛮力解决方案,但必须有一个比n^2更快的解决方案 我有一个包含两列的数据框:Name和Likes Food 作为输出,我希望为每个唯一的名称提供一个独特的食物值列表 数据帧df示例 Index Name Likes Food 0 Tim Pizza 1 Mar
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]
>>>
索引名称喜欢食物列表
0 Tim 3[比萨饼、意大利面、寿司]
1玛丽2[比萨饼,寿司]
2艾米2[比萨饼,红薯]
3约翰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]
要同时对这两列进行排序,请尝试以下操作:
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]
另外,如果熊猫
.25
+,你可以尝试df.groupby('Name',sort=False.).agg(Likes_Food=('Likes','nunique')、Food_List=('Likes','unique'))
@Quickbeam2k1你应该使用nunique
而不是size
,如果你明白这很有效的话。谢谢我要花很长时间来学习这个语法…如果pandas.25
+,你可以尝试df.groupby('Name',sort=False.).agg(Likes_Food=('Likes','nunique')、Food_List=('Likes','unique'))
@Quickbeam2k1如果你知道这很有效的话,你应该使用nunique
而不是size
。谢谢我要花很长时间来学习这个语法。。。
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]