如何在熊猫 groupby 之后获取列表列表
Posted
技术标签:
【中文标题】如何在熊猫 groupby 之后获取列表列表【英文标题】:how to get list of list after pandas groupby 【发布时间】:2020-11-21 02:21:03 【问题描述】:我搜索了我的问题,它与question 类似。 但是,它没有给出预期的结果,所以我仍然卡住了。 我有一个这样的列表:
import pandas as pd
l=[[1,'John','Wed',28],[1,'John','Fri',30],[2,'Alex','Fri',40],[2,'Alex','Fri',60]]
我做到了
o=pd.DataFrame(l,columns=['id','name','day','marks'])
r = o.groupby(['id','name','day']).marks.mean().reset_index().values.tolist()
现在我得到的看起来像这样
[[1,'John','Wed',28],[1,'John','Fri',30],[2,'Alex','Fri',50]]
谁能帮我弄点类似的东西
[[1,'John',[['Wed',28],['Fri',30]]], [2,'Alex',[['Fri',50]]]]
【问题讨论】:
【参考方案1】:你可以这样做:
# get mean marks
df['mean_marks'] = df.groupby(['id', 'name', 'day'])['marks'].transform('mean')
# create list of day, marks
df['mark_list'] = df[['day','mean_marks']].agg(list, 1)
# aggregate
df = (df
.groupby(['id', 'name'])['mark_list']
.apply(list)
.apply(lambda x: [list(y) for y in set([tuple(j) for j in x])])
.reset_index())
print(df)
id name mark_list
0 1 John [[Wed, 28], [Fri, 30]]
1 2 Alex [[Fri, 50]]
【讨论】:
非常感谢......这正是我想要做的【参考方案2】:您可以使用defaultdict
将r
中的数据获取到您想要的输出中:
from collections import defaultdict
d = defaultdict(list)
for number, name, day, day_number in r:
d[(number, name)].append([day, day_number])
#pull data into list form with a list comprehension
[[*key, value] for key, value in d.items()]
[[1, 'John', [['Fri', 30], ['Wed', 28]]], [2, 'Alex', [['Fri', 50]]]]
或者,您可以在纯 Python 中运行整个过程,但需要注意的是您必须使用 defaultdict
两次,这是有道理的,因为 defaultdict
正在对您的数据进行分组:
from collections import defaultdict
from statistics import mean
d = defaultdict(list)
for number, name, day, day_number in l:
d[(number, name, day)].append(day_number)
d = key:mean(value) for key, value in d.items()
d = [[*key[:2], [*key[2:],value]] for key, value in d.items()]
box = defaultdict(list)
for number, name, [day, day_number] in d:
box[(number, name)].append([day, day_number])
[[*key, value] for key, value in box.items()]
[[1, 'John', [['Wed', 28], ['Fri', 30]]], [2, 'Alex', [['Fri', 50]]]]
【讨论】:
以上是关于如何在熊猫 groupby 之后获取列表列表的主要内容,如果未能解决你的问题,请参考以下文章