我正在学习将自定义功能应用于数据框中的每个组。假设我有如下数据框:
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: []
>>>
如何获得所需的输出?预先感谢。
答案 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
传递给函数,而不是x
和y
传递给函数,以在代码中提供更多便利。