如何在熊猫中的df.groupby()上使用apply()

时间:2020-08-12 22:18:11

标签: python pandas dataframe group-by apply

我知道如何在大熊猫中使用groupby()使用聚合函数,例如均值,总和等,但是我想知道如何使用apply()进一步应用所需的函数。

例如,在此数据集中,有两家公司“第一”和“第二”:

import pandas as pd
raw_data = {'regiment': ['Nighthawks', 'Nighthawks', 'Nighthawks', 'Nighthawks', 'Dragoons', 'Dragoons', 'Dragoons', 'Dragoons', 'Scouts', 'Scouts', 'Scouts', 'Scouts'], 
        'company': ['1st', '1st', '2nd', '2nd', '1st', '1st', '2nd', '2nd','1st', '1st', '2nd', '2nd'], 
        'name': ['Miller', 'Jacobson', 'Ali', 'Milner', 'Cooze', 'Jacon', 'Ryaner', 'Sone', 'Sloan', 'Piger', 'Riani', 'Ali'], 
        'preTestScore': [4, 24, 31, 2, 3, 4, 24, 31, 2, 3, 2, 3],
        'postTestScore': [25, 94, 57, 62, 70, 25, 94, 57, 62, 70, 62, 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循环效率不高。

2 个答案:

答案 0 :(得分:0)

这是解决问题的一种方法,它遍历分组,这是适用的方法:

{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, 'M': 1, 'S': 1}}

答案 1 :(得分:0)

让我们尝试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, 'S': 1, 'P': 1}
2nd            {'A': 2, 'M': 1, 'R': 2, 'S': 1}
Name: name, dtype: object