用个性化定制箱(树棚)对Pandas栏进行分类

2024-05-18 14:31:15 发布

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

我有一个dataframe,其中一些数值存储在列“value”中,并伴随着它们各自的分类树(在本例中是警告级别),存储在其他列中(在我的例子中,“low”“middle”“high”):

     value    low  middle    high
0   179.69  17.42   88.87  239.85
1     2.58  17.81   93.37  236.58
2     1.21   0.05    0.01    0.91
3     1.66   0.20    0.32    4.57
4     3.54   0.04    0.04    0.71
5     5.97   0.16    0.17    2.55
6     5.39   0.86    1.62    9.01
7     1.20   0.03    0.01    0.31
8     3.19   0.08    0.01    0.45
9     0.02   0.03    0.01    0.10
10    3.98   0.18    0.05    0.83
11  134.51  78.63  136.86  478.27
12  254.53  83.73  146.33  486.65
13   15.36  86.07   13.74  185.16
14   85.10  86.12   13.74  185.16
15   15.12   1.37    6.09   30.12

我想知道每个值属于哪个类别(例如,第一个值是,第二个值是低于,因为它比任何树都小,第三个值是。。。你明白了)。以下是预期产出:

^{pr2}$

到目前为止,我使用这个难看的过程,一行一行地“手动”检查,停止在第一个类别(从高到低),比当前值大:

df["category"]="below_low"    
for i in df.index:
    for cat in ["high","middle","low"]:
        if df.loc[i,"value"]>df.loc[i,cat]:
            df.loc[i,"category"]=cat
            break

我知道pd.cut()方法,但我只知道如何在预定义的泛型tresholds列表中使用它。有人能告诉我遗漏了什么吗?在


Tags: inmiddledataframedfforvalue分类类别
2条回答

在其他宇宙中,你应该使用耶兹雷尔经典的矢量方法。然而,如果你对apply做事的方式感到好奇,那么,你可以

In [702]: df.apply(lambda x: 'high' if x.value > x['high'] 
                        else 'middle' if x.value > x['middle'] 
                        else 'low' if x.value > x['low'] 
                        else 'below low', axis=1)
Out[702]:
0        middle
1     below low
2          high
3        middle
4          high
5          high
6        middle
7          high
8          high
9        middle
10         high
11          low
12       middle
13       middle
14       middle
15       middle
dtype: object

您可以使用:

  • 删除列value
  • ^{}比较(小于)
  • 列的更改顺序
  • 累计和列-第一个True获取1
  • 通过^{}与{}比较

mask = df.drop('value',axis=1)
         .lt(df['value'], axis=0)
         .reindex(columns=['high','middle','low'])
         .cumsum(axis=1)
         .eq(1)

如果列highmiddlelow中的所有值都是False,那么一定的正确性是必要的。我通过反转maskall创建新列。在

^{pr2}$

最后一次呼叫^{}

^{3}$

以多个^{}为尖Paul H的解决方案:

df['category'] = np.where(df['high'] < df['value'], 'high', 
                 np.where(df['middle'] < df['value'], 'medium',
                 np.where(df['low'] < df['value'], 'low', 'below_low')))

print (df)
     value    low  middle    high   category
0   179.69  17.42   88.87  239.85       high
1     2.58  17.81   93.37  236.58  below_low
2     1.21   0.05    0.01    0.91       high
3     1.66   0.20    0.32    4.57     medium
4     3.54   0.04    0.04    0.71       high
5     5.97   0.16    0.17    2.55       high
6     5.39   0.86    1.62    9.01     medium
7     1.20   0.03    0.01    0.31       high
8     3.19   0.08    0.01    0.45       high
9     0.02   0.03    0.01    0.10     medium
10    3.98   0.18    0.05    0.83       high
11  134.51  78.63  136.86  478.27        low
12  254.53  83.73  146.33  486.65     medium
13   15.36  86.07   13.74  185.16     medium
14   85.10  86.12   13.74  185.16     medium
15   15.12   1.37    6.09   30.12     medium

相关问题 更多 >

    热门问题