Python 按自定义函数分组

Python 按自定义函数分组,python,python-3.x,pandas,group-by,aggregate-functions,Python,Python 3.x,Pandas,Group By,Aggregate Functions,这应该很简单。我想要的是能够根据函数的结果进行分组,就像在SQL中可以通过表达式进行分组一样: SELECT substr(name, 1) as letter, COUNT(*) as count FROM table GROUP BY substr(name, 1) 这将计算名称列以字母表的每个字母开头的行数 我想在python中也这样做,所以我假设我可以将一个函数传递给groupby。但是,这只将索引列(第一列)传递给函数,例如0、1或2。我想要的是“名称”列: import panda

这应该很简单。我想要的是能够根据函数的结果进行分组,就像在SQL中可以通过表达式进行分组一样:

SELECT substr(name, 1) as letter, COUNT(*) as count
FROM table
GROUP BY substr(name, 1)
这将计算名称列以字母表的每个字母开头的行数

我想在python中也这样做,所以我假设我可以将一个函数传递给groupby。但是,这只将索引列(第一列)传递给函数,例如0、1或2。我想要的是“名称”列:

import pandas

# Return the first letter
def first_letter(row):

    # row is 0, then 1, then 2 etc.
    return row.name[0]

#Generate a data set of words
test = pandas.DataFrame({'name': ["benevolent", "hidden", "absurdity", "anonymous", "furious", "antidemocratic", "honeydew"]})

#              name
# 0      benevolent
# 1          hidden
# 2       absurdity
# 3       anonymous
# 4         furious
# 5  antidemocratic
# 6        honeydew

test.groupby(first_letter)

我做错了什么。如何按行索引以外的内容分组?

为第一个字母创建一个新列:

def first_letter(row):
    return row[0]

test['first'] = test['name'].apply(first_letter)
并将其分组:

group = test.groupby('first')
使用它:

>>> group.count()

     name
first      
a         3
b         1
f         1
h         2

您通常希望在字符串列上使用向量化的
str
运算符。使用
get(0)
提取第一个字母,然后在
groupby
操作中使用。最后,我们对结果进行计数

以下是指向的熊猫文档的链接

请注意,您可以使用正则表达式模式来提取更复杂的表达式

>>> test.groupby(test['name'].str.get(0))['name'].count()
name
a       3
b       1
f       1
h       2
Name: name, dtype: int64
更一般地说,您的函数应该返回dataframe中的唯一项,在该项上隐式地将其与其索引组合在一起

例如,可以使用对数字进行舍入的函数对舍入的数字进行分组

df = pd.DataFrame({'A': [0.25, 0.75, 2.6, 2.7, 2.8]})

>>> np.round(df.A)
0    0
1    1
2    3
3    3
4    3
Name: A, dtype: float64

>>> df.groupby(np.round(df.A)).mean()
      A
A      
0  0.25
1  0.75
3  2.70
自定义函数应应用于一系列数据帧,例如布尔运算符:

def ge_two(series):
    return series >= 2

>>> df.groupby(ge_two(df.A)).sum()
         A
A         
False  1.0
True   8.1

虽然这对本例有效,但我的实际数据不是字符串。我要寻找的是一种通过函数resultThanks对编辑进行分组的通用方法。这更有意义。因此,为了避免向数据帧中添加新列,我可以创建一个函数,该函数返回一个基于序列的数组,就像您使用ge_two
np所做的那样。round(df.a)
实际上返回一个序列,其中包含一个索引和从函数返回的值,然后将用于分组。在接受的答案中,函数的值存储回dataframe中,然后dataframe在索引和分组值之间进行对齐。是的,这证实了我的想法。实际上我更喜欢这个答案,因为它不需要添加新的系列。df.groupby(np.round(df.a))对我很有帮助,非常感谢!