在满足条件的SeriesGroupBy对象上使用Apply

时间:2016-07-01 09:42:56

标签: python pandas

我有一个DataFrame df1

 df1.head() = 

           id      ret     eff
    1469  2300 -0.010879  4480.0
    328   2300 -0.000692 -4074.0
    1376  2300 -0.009551  4350.0
    2110  2300 -0.014013  5335.0
    849   2300 -0.286490 -9460.0

我想创建一个新列,其中包含列df1['eff']的规范化值 换句话说,我想按df1['eff']df1['id']进行分组,查找最大值(mx = df1['eff'].max())和最小值(mn = df2['eff'].min()),然后成对分割根据{{​​1}}或df1['eff']制定mnmxdf1['eff'] > 0列的每个值。

我写的代码如下:

df1['eff']< 0

但是python会抛出以下错误:

df1['normd'] = df1.groupby('id')['eff'].apply(lambda x: x/x.max() if x > 0 else x/x.min())

由于*** ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all(). df1.groupby('id')['eff'],我决定使用SeriesGroupBy Object。 但是python再次抛出以下错误:

map()

非常感谢提前。

1 个答案:

答案 0 :(得分:3)

您可以使用自定义功能f,可以轻松添加print。因此xSeries,您需要按numpy.where比较每个组。输出为numpy array,您需要将其转换为Series

def f(x):
    #print (x)
    #print (x/x.max())
    #print (x/x.min())
    return pd.Series(np.where(x>0, x/x.max(), x/x.min()), index=x.index)


df1['normd'] = df1.groupby('id')['eff'].apply(f)
print (df1)
        id       ret     eff     normd
1469  2300 -0.010879  4480.0  0.839738
328   2300 -0.000692 -4074.0  0.430655
1376  2300 -0.009551  4350.0  0.815370
2110  2300 -0.014013  5335.0  1.000000
849   2300 -0.286490 -9460.0  1.000000

与...相同:

df1['normd'] = df1.groupby('id')['eff']
                  .apply(lambda x: pd.Series(np.where(x>0, 
                                                      x/x.max(), 
                                                      x/x.min()), index=x.index))
print (df1)
        id       ret     eff     normd
1469  2300 -0.010879  4480.0  0.839738
328   2300 -0.000692 -4074.0  0.430655
1376  2300 -0.009551  4350.0  0.815370
2110  2300 -0.014013  5335.0  1.000000
849   2300 -0.286490 -9460.0  1.000000