【问题标题】:How to categorize a range of values in Pandas DataFrame如何在 Pandas DataFrame 中对一系列值进行分类
【发布时间】:2019-04-15 00:36:59
【问题描述】:

假设我有以下 DataFrame:

   Area
0  14.68
1  40.54
2  10.82
3  2.31
4  22.3

我想在范围内对这些值进行分类。比如A:[1,10],B:[11,20],C...

   Area
0  B
1  D
2  C
3  A
4  C

我如何使用 Pandas 做到这一点?我尝试了以下代码:

bins = pd.IntervalIndex.from_tuples([(0, 11), (11, 20), (20, 50), (50, 100), (100, 500), (500, np.max(df["area"]) + 1)], closed='left')
catDf = pd.cut(df["area"], bins = bins)

但是“cut”命令只是将范围值放在 DataFrame 中,我想放置类别名称而不是范围。

编辑:我尝试将标签传递给剪辑,但没有任何变化。 EDIT2:澄清一下,如果“面积”的值有 10.21,那么它在 [10,20] 的范围内,所以它必须标记为“B”或该范围值的其他标签.

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    对我来说 cat.codes 通过将列表 a 转换为 numpy 数组进行索引:

    a = list('ABCDEF')
    df['new'] = np.array(a)[pd.cut(df["Area"], bins = bins).cat.codes]
    print (df)
         Area new
    0   14.68   B
    1   40.54   C
    2   10.82   A
    3    2.31   A
    4   22.30   C
    5  600.00   F
    

    catDf = pd.Series(np.array(a)[pd.cut(df["Area"], bins = bins).cat.codes], index=df.index)
    print (catDf)
    0    B
    1    C
    2    A
    3    A
    4    C
    5    F
    dtype: object
    

    【讨论】:

    • 完美。谢谢你,这正是我想要的,简单而干净的解决方案。没有找到“代码”功能。再次感谢您
    【解决方案2】:

    您可以指定如下标签:

    注意不确定您使用了哪些范围:

    pd.cut(df.Area, [1,10, 20, 50, 100], labels=['A', 'B', 'C', 'D'])
    
    0    B
    1    C
    2    B
    3    A
    4    C
    Name: Area, dtype: category
    Categories (4, object): [A < B < C < D]
    

    【讨论】:

    • 我需要一个值范围的标签。假设值 10.23 在 [10,20] 的范围内,所以它的值将是 A。所有范围值都有标签,如果“are”的值在范围内,那么它将转换为 A
    【解决方案3】:

    假设 bins 是一个全局变量,你可以这样做

       def number_to_bin(number):
            ALPHABETS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
            for i, bin in enumerate(bins):
                if number >= bin[0] and number <= bin[1]:
                    return ALPHABETS[i]
    
       df["area"] = df["area"].apply(number_to_bin)
    

    【讨论】:

    • 如果您有固定的 bin 值,例如 1、10、20 等,则可以使用。但由于我有一系列值,所以这个解决方案不起作用。
    猜你喜欢
    • 2021-12-17
    • 2020-11-16
    • 2017-10-24
    • 2021-08-24
    • 2016-12-06
    • 2012-07-08
    • 2014-07-10
    • 2020-12-06
    • 2023-02-01
    相关资源
    最近更新 更多