Python 在分组转换中使用基于条件的逻辑
我有一个数据框架,其中有一个年份列(“年份”和一个美元值列)。我想按年份分组,然后针对每一行,确定该行是高于该组的中位数20%还是低于该组的中位数20% 我尝试了以下方法:Python 在分组转换中使用基于条件的逻辑,python,pandas,Python,Pandas,我有一个数据框架,其中有一个年份列(“年份”和一个美元值列)。我想按年份分组,然后针对每一行,确定该行是高于该组的中位数20%还是低于该组的中位数20% 我尝试了以下方法: def f(x): if x >= 1.2* np.median(x): return 'H' elif x<= .8* np.median(x): return 'L' transformed = df.groupby('Year').transform(f)
def f(x):
if x >= 1.2* np.median(x):
return 'H'
elif x<= .8* np.median(x):
return 'L'
transformed = df.groupby('Year').transform(f)
def(x):
如果x>=1.2*np.中值(x):
返回“H”
elif x我想你想要的是这样的:
n = 20
dr = randint(2000, 2014, size=n)
df = DataFrame({'year': dr, 'dollar': hstack((poisson(1000, size=n / 2), poisson(100000, size=n / 2)))})
def med_replace(x):
res = Series(index=x.index, name='med_cmp')
med = x.dollar.median()
upper = 1.2 * med
lower = 0.8 * med
res[x.dollar >= upper] = 'H'
res[x.dollar <= lower] = 'L'
res[(x.dollar > lower) & (x.dollar < upper)] = 'N'
return x.join(res)
df.groupby('year').apply(med_replace)
numpyndarray
不是bool
的有效参数,除非其size
为0或1。这意味着您无法评估其“真实性”在if语句中,除非它有0或1个元素。这就是您报告错误的原因。完美。非常感谢。我已经更新了我的答案,使用np。选择哪个IMO更容易阅读。:)实际上一个问题:上面的答案基于一个条件(行值是否大于中值?)。如何修改答案以检查其是否高于1.2*中位数或低于.8*中位数?是bools=x.dollar>=x.dollar.median()*1.2还是x.dollar?我尝试了上面的方法,得到了相同的错误,关于真值是模糊的。这将帮助您确定下一步要做什么。
dollar year med_cmp
0 1016 2004 N
1 956 2002 L
2 1044 2010 N
3 985 2008 L
4 1038 2001 L
5 997 2001 L
6 1015 2001 L
7 971 2012 L
8 1017 2013 N
9 1040 2010 N
10 99760 2001 H
11 99835 2001 H
12 100017 2012 H
13 99532 2001 H
14 100311 2011 N
15 100344 2002 H
16 100209 2007 N
17 99988 2008 H
18 100204 2007 N
19 100996 2005 N