如何在Pandas中编写聚合函数,条件在其他列上

时间:2018-05-21 12:56:01

标签: python pandas aggregate-functions apply pandas-groupby

假设数据帧df包含列a,b,c,d。 我知道在Panda中定义聚合值的函数的方法,如:

def my_agg(x):
    names = {
        'a_Total': x['a'].sum(), 
        'b_Mean': x['b'].mean()
     }
    return pd.Series(names, index=['a_Total','b_Mean'])

d_aggregate = df.groupby(['c','d']).apply(my_agg)

我正在寻找的方法是分别根据列中的选择值取a或b的总和或平均值的方法' c'或者' d'。

示例数据:

df=pd.DataFrame({"a":[10,20,30,40],
             "b":[1,2,3,4],
             "c":[c1,c1,c1,c2],
             "d":[100,200,300,400]})

我的综合功能:

def my_agg91(x):
names = {
    'Sum_a': x['a'].sum(),   
    'Mean_b': x['b'].mean()}

return pd.Series(names, index=['Sum_a','Mean_b'])

df2= df.groupby(['c']).apply(my_agg91)

给了我:

    Sum_a  Mean_b
c                
c1   60.0     2.0
c2   40.0     4.0

我想要的:' a'对于'<<<<><< 250&对于'>> 250(在单个数据帧中) 请建议功能的变化以获得输出:

    Sum_a  Mean_b
c                
c1   30.0     3.0
c2    0.0     4.0

1 个答案:

答案 0 :(得分:0)

根据您的功能进行过滤,例如:

def my_agg92(x):
   names = {
       'Sum_a': x[x['d'] < 250]['a'].sum(),   
       'Mean_b': x[x['d'] > 250]['b'].mean()}

   return pd.Series(names, index=['Sum_a','Mean_b'])

df.groupby(['c']).apply(my_agg92)