问题描述
我知道如何在大熊猫中使用groupby()使用聚合函数,例如均值,总和等,但是我想知道如何使用apply()进一步应用所需的函数。
例如,在此数据集中,有两家公司“第一”和“第二”:
import pandas as pd
raw_data = {'regiment': ['Nighthawks','Nighthawks','Dragoons','Scouts','Scouts'],'company': ['1st','1st','2nd','2nd'],'name': ['Miller','Jacobson','Ali','Milner','Cooze','Jacon','Ryaner','Sone','Sloan','Piger','Riani','Ali'],'preTestScore': [4,24,31,2,3,4,3],'postTestScore': [25,94,57,62,70,25,70]}
df = pd.DataFrame(raw_data,columns = ['regiment','company','name','preTestScore','postTestScore'])
我想添加一列,该列映射名称的第一个字母和该字母的出现次数。例如:
list(df.groupby(['company'])['name'])
[('1st',0 Miller
1 Jacobson
4 Cooze
5 Jacon
8 Sloan
9 Piger
Name: name,dtype: object),('2nd',2 Ali
3 Milner
6 Ryaner
7 Sone
10 Riani
11 Ali
Name: name,dtype: object)]
我想要一个像这样的分组熊猫数据框:
company name_dict
1st {'M':1,'J':2 ..}
2nd {'M':1,'R':2,'A': 1..}
如果数据框是使用for循环的列表,我将知道如何派生name_dict,但是我如何应用使用pandas groupby派生列的函数呢?该功能的输入应该是什么?
例如,假设函数为
def get_name_dict():
...
应该是什么意思?如何使用groupby将功能映射到熊猫数据框?
添加:我问这个问题的原因是因为apply()的运行速度比for循环快,此数据帧中大约有70K行,并且使用列表和for循环效率不高。
解决方法
这是解决问题的一种方法,它遍历分组,这是适用的方法:
{key: value.str[0].value_counts().to_dict()
for key,value in df.groupby("company").name}
{'1st': {'J': 2,'M': 1,'P': 1,'S': 1,'C': 1},'2nd': {'R': 2,'A': 2,'S': 1}}
,
让我们尝试collections.Counter
import collections
df.name.str[0].groupby(df['company']).apply(lambda x : [collections.Counter(x)]).str[0]
Out[119]:
company
1st {'M': 1,'J': 2,'C': 1,'P': 1}
2nd {'A': 2,'R': 2,'S': 1}
Name: name,dtype: object