1

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

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: []
>>> 

如何获得所需的输出?提前致谢。

4

2 回答 2

2

这应该是工作:

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

请记住将 a 传递DataFrame给函数,而不是x为了y更方便您的代码。

于 2019-07-04T15:58:42.973 回答
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
于 2019-07-04T14:30:34.517 回答