Python 使用个性化定制箱(tresholds)对熊猫栏进行分类

Python 使用个性化定制箱(tresholds)对熊猫栏进行分类,python,pandas,dataframe,binning,Python,Pandas,Dataframe,Binning,我有一个dataframe,其中一些数值存储在“value”列中,并附有各自的分类树(本例中为警告级别),存储在其他列中(本例中为“low”、“middle”、“high”): 我想知道每个值属于哪一类(例如,第一个值是中间值,第二个值低于_low,因为它比它的任何一个树都小,第三个值高,…你明白了)。因此,以下是预期输出: value low middle high category 0 179.69 17.42 88.87 239.85 mid

我有一个
dataframe
,其中一些数值存储在“value”列中,并附有各自的分类树(本例中为警告级别),存储在其他列中(本例中为“low”、“middle”、“high”):

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

     value    low  middle    high   category
0   179.69  17.42   88.87  239.85     middle
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     middle
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     middle
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     middle
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     middle
13   15.36  86.07   13.74  185.16     middle
14   85.10  86.12   13.74  185.16     middle
15   15.12   1.37    6.09   30.12     middle
到目前为止,我使用了“手动”逐行检查的丑陋程序,在第一个类别(从高到低)处停止,大于当前值:

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列表中使用它。有人能告诉我遗漏了什么吗?

你可以使用:

  • 删除列
  • 与(少于)相比
  • 列的更改顺序
  • 累计和列-第一个
    True
    get
    1
  • 通过与
    1
    进行比较

如果列
high
middle
low
中的所有值都是
False
,则需要一些正确性。我使用反转的
掩码和
全部创建新列

mask['below_low'] = (~mask).all(axis=1)
print (mask)
     high middle    low below_low
0    True  False  False     False
1   False  False  False      True
2    True  False  False     False
3   False   True  False     False
4    True  False  False     False
5    True  False  False     False
6   False   True  False     False
7    True  False  False     False
8    True  False  False     False
9   False   True   True     False
10   True  False  False     False
11  False  False   True     False
12  False   True  False     False
13  False   True   True     False
14  False   True   True     False
15  False   True  False     False
最后一通电话:

具有多个指定值的解决方案:

df['category']=np.其中(df['high']
您可以使用:

  • 删除列
  • 与(少于)相比
  • 列的更改顺序
  • 累计和列-第一个
    True
    get
    1
  • 通过与
    1
    进行比较

如果列
high
middle
low
中的所有值都是
False
,则需要一些正确性。我使用反转的
掩码和
全部创建新列

mask['below_low'] = (~mask).all(axis=1)
print (mask)
     high middle    low below_low
0    True  False  False     False
1   False  False  False      True
2    True  False  False     False
3   False   True  False     False
4    True  False  False     False
5    True  False  False     False
6   False   True  False     False
7    True  False  False     False
8    True  False  False     False
9   False   True   True     False
10   True  False  False     False
11  False  False   True     False
12  False   True  False     False
13  False   True   True     False
14  False   True   True     False
15  False   True  False     False
最后一通电话:

具有多个指定值的解决方案:

df['category']=np.其中(df['high']
在其他任何一个宇宙中,你都应该使用耶斯雷尔的经典矢量方法。然而,如果你对
应用
的做事方式感到好奇,那么,你可以

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

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

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

我建议对
numpy进行一组嵌套调用。其中
我建议对
numpy进行一组嵌套调用。其中
你是一个天生的奇迹,耶兹雷尔!)尽管如此,对于一项看似简单的任务来说,它似乎是一个相当高级的解决方案。至少我平静下来了,我没有错过一些令人尴尬的直接使用pd.cut()的机会。。。谢谢这是矢量运算的黄金展示+先生,你是个天生的奇迹,耶斯雷尔!:)尽管如此,对于一项看似简单的任务来说,它似乎是一个相当高级的解决方案。至少我平静下来了,我没有错过一些令人尴尬的直接使用pd.cut()的机会。。。谢谢这是矢量运算的黄金展示+先生。谢谢约翰对初学者的友好:)!目前,对我来说,理解类似于应用的解决方案要容易得多。那些向量运算对我来说太不直观了…:(谢谢约翰对初学者很好:)!目前,对我来说,理解类似于应用的解决方案要容易得多。那些向量运算对我来说太不直观了…:(
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
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