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列表中使用它。有人能告诉我遗漏了什么吗?你可以使用:
- 删除列
值
- 与(少于)相比
- 列的更改顺序
- 累计和列-第一个
getTrue
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
get1
- 通过与
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