熊猫中复杂的群体

时间:2018-04-16 20:40:04

标签: python pandas pandas-groupby

有没有办法使用groupby()的函数形式,例如groupby(f)其中f是一个函数,按表内容分组?看起来f()只是用索引调用。

样品:

import pandas as pd

df0 = pd.DataFrame([
    dict(age=30,sex='M',name='Jim',weight=143),
    dict(age=45,sex='F',name='Francine',weight=102),
    dict(age=22,sex='F',name='Jill',weight=190),
    dict(age=37,sex='M',name='Joseph',weight=221),
    dict(age=55,sex='M',name='Jerry',weight=187),
    dict(age=48,sex='M',name='Gus',weight=262),
    dict(age=45,sex='F',name='Jean',weight=112),
    dict(age=28,sex='F',name='Fiona',weight=133),
    dict(age=25,sex='M',name='Greg',weight=165),
    dict(age=34,sex='F',name='Jennifer',weight=137),
    dict(age=26,sex='M',name='Jason',weight=172),
    dict(age=28,sex='M',name='Jerome',weight=205),
    dict(age=61,sex='F',name='Faye',weight=140),
    dict(age=32,sex='M',name='Joshua',weight=180)])
df0.groupby('sex').mean()

打印出来

           age      weight
sex                       
F    39.166667  135.666667
M    35.125000  191.875000

但如果我想按性别分组,然后按姓名的第一个字母分组呢?

2 个答案:

答案 0 :(得分:2)

尝试使用带有索引的str访问器作为groupby列表中的第二个元素:

df0.groupby(['sex',df0['name'].str[0]]).mean()

输出:

                age      weight
sex name                       
F   F     44.666667  125.000000
    J     33.666667  146.333333
M   G     36.500000  213.500000
    J     34.666667  184.666667

答案 1 :(得分:2)

如果您需要使用某个功能,可以创建一个新列:

def get_key(df):
    return df["sex"] + "-" + df["name"].str[0]

df0.assign(my_key=get_key).groupby("my_key").mean()