如何在熊猫 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】:

您可以使用defaultdictr 中的数据获取到您想要的输出中:

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 之后获取列表列表的主要内容,如果未能解决你的问题,请参考以下文章

如何在python中获取熊猫数据框的行列表? [复制]

如何从熊猫系列中获取包含行索引的列表[重复]

如何在熊猫的 groupby 对象中获取组数?

如何在飞镖列表中获取重复值的总和?

如何使用熊猫查找重复名称?

如何根据列表中的项目复制熊猫中的行[重复]