尝试根据系列四分位数中的相应位置将pandas df系列浮点数转换为四个分类值之一

时间:2017-02-06 19:09:06

标签: python pandas

我试图编写一个函数,该函数通过一个充满浮点数的pandas df系列,并根据它们在系列范围内的位置将它们转换为四个字符串分类变量之一。因此,范围四分位数中的所有值都将转换为low,low_mid,high_mid或high。我已经通过多种方式完成了它,但不断收到各种错误消息。最新的尝试及其信息如下。如果有人可以偷看并抛弃任何想法/修复,我会很感激。谢谢!

def makeseriescategorical(x):
    for i in x:
        if i < 59863.0:
            str(i)
            i.replace(i, "low")
        elif i > 59862.0 and i < 86855.0:
            str(i)
            i.replace(i, "low_mid")
        elif i > 86854.0 and i < 125250.0:
            str(i)
            i.replace(i, "high_mid")
        elif i > 125249.0 and i < 332801:
            str(i)
            i.replace(i, "high")

我上次尝试的错误信息是: AttributeError:&#39; numpy.float64&#39;对象没有属性&#39;替换&#39;

我已经尝试过其他各种方法来使它成为像astype这样的字符串,但我一直都会遇到错误。我对编码很陌生,所以我确信我很有可能犯了一个愚蠢的错误,但我很感激任何人都能给我的帮助。欢呼声。

1 个答案:

答案 0 :(得分:4)

我使用了矢量化pd.cut()方法:

In [51]: df = pd.DataFrame(np.random.randint(0, 332801, 10), columns=['val'])

In [52]: df
Out[52]:
      val
0  230852
1  140030
2  231657
3   73146
4  240890
5  328660
6  194801
7  240684
8   44439
9   35558

In [53]: bins = [-np.inf, 59863.0, 86855.0, 125250.0, 332801]

In [54]: labels=['low','low_mid','high_mid','high']

In [55]: df['category'] = pd.cut(df.val, bins=bins, labels=labels)

In [56]: df
Out[56]:
      val category
0  230852     high
1  140030     high
2  231657     high
3   73146  low_mid
4  240890     high
5  328660     high
6  194801     high
7  240684     high
8   44439      low
9   35558      low

In [57]: df.dtypes
Out[57]:
val            int32
category    category
dtype: object