在分组转换中使用基于条件的逻辑

2024-03-28 23:25:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据框架,其中有一个year列(“年”)和一个dollar value列。我想按年份分组,然后针对每一行,确定该行是高于该组的中位数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)

但是我得到一个错误,数组的真值是不明确的。这让我觉得python将等式左侧和右侧的x都视为值的数组,而在其他转换函数中,它知道左侧的x是行元素,右侧的x被包装在聚合中,x是数组。你知道吗

你知道怎么做吗?你知道吗


Tags: 数据方法框架returnifvaluedefnp
1条回答
网友
1楼 · 发布于 2024-03-28 23:25:57

我想你想要的是这样的:

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)

屈服:

    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

numpy ndarray不是bool的有效参数,除非它的size是0或1。这意味着您不能在if语句中计算它的“真实性”,除非它有0或1个元素。这就是为什么你得到你报告的错误。你知道吗

相关问题 更多 >