根据特定的列进行分组并在Python中应用该功能

时间:2019-07-04 14:27:51

标签: python pandas pandas-groupby

我正在学习将自定义功能应用于数据框中的每个组。假设我有如下数据框:

A       B       C
1       4       3
1       5       4
1       2       10
2       7       2
2       4       4
2       6       6

我定义了一个简单的函数来获取列“ B”的长度和列“ C”的总和,然后求和“ A”列中每个组的长度和总和,以生成列“ D”。因此,我希望得到以下输出:

A       D
1       20
2       15

我运行了下面的代码,但无法获得我想要的东西:

>>> import pandas as pd
>>> 
>>> df = pd.read_csv("foo.txt", sep="\t")
>>> df
   A  B   C
0  1  4   3
1  1  5   4
2  1  2  10
3  2  7   2
4  2  4   4
5  2  6   6
>>> 
>>> def someFunction(x, y):
...         length = len(x)
...         total = sum(y)
...         number = length + total
...         print(number)
... 
>>> f = lambda x: someFunction(x['B'], x['C'])
>>> output = df.groupby(['A']).apply(f)
20
20
15
>>> output
Empty DataFrame
Columns: []
Index: []
>>> 

如何获得所需的输出?预先感谢。

2 个答案:

答案 0 :(得分:1)

您可以将DataFrame.agg用于多个聚合功能,然后在sum上使用axis=1

df.groupby('A').agg({'B':'size', 'C':'sum'}).sum(1).reset_index(name='D')

   A   D
0  1  20
1  2  15

答案 1 :(得分:1)

这应该工作:

import pandas as pd 

df= pd.DataFrame()

df['A']= [1,1,1,2,2,2]
df['B']= [4,3,2,7,4,6]
df['C']= [3,4,10,2,4,6]

def someFunction(data):

    return len(data['B'])+ sum(data['C'])

# apply to groupby 
df.groupby('A').apply(someFunction)

Output[1]:

A
1    20
2    15
dtype: int64

请记住将DataFrame传递给函数,而不是xy传递给函数,以在代码中提供更多便利。