我有一个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']
制定mn
或mx
列df1['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()
非常感谢提前。
答案 0 :(得分:3)
您可以使用自定义功能f
,可以轻松添加print
。因此x
为Series
,您需要按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