首页 > 解决方案 > 根据布尔条件分配类别

问题描述

我试图弄清楚是否有更好的方法来根据条件对数据进行分类。

示例数据: 查看已识别的地点是否具有物理社会和/或经济角色。如果存在任何/许多角色,则该位置标记为“1”。

import pandas as pd
df = pd.DataFrame([[0, 1, 0], [0, 1, 1], [0, 1, 0], [0, 0, 1], [1,1,1], [1,1,0], columns=["PHYSICAL", "SOCIAL", "ECONOMIC"])

数据

|   | PHYSICAL | SOCIAL | ECONOMIC | 
| - | -------- | ------ | -------- | 
| 0 | 0        | 1      | 0        | 
| 1 | 0        | 1      | 1        | 
| 2 | 0        | 1      | 0        | 
| 3 | 0        | 0      | 1        | 
| 4 | 1        | 1      | 1        |       
| 5 | 1        | 1      | 0        |      

我想知道的:如何创建一个新,根据真/假值为每一行分配一个类别。

所有可能的类别:

预期成绩

|   | PHYSICAL | SOCIAL | ECONOMIC | CATEGORY        |
| - | -------- | ------ | -------- | --------------- |
| 0 | 0        | 1      | 0        | social          |
| 1 | 0        | 1      | 1        | social_economic |
| 2 | 0        | 1      | 0        | social          |
| 3 | 0        | 0      | 1        | economic        |
| 4 | 1        | 1      | 1        | all_cat         |
| 5 | 1        | 1      | 0        | physical_social |

我试过的:

df['CATEGORY'] = np.where(df['PHYSICAL'], np.where(df['SOCIAL'], 
np.where(df['ECONOMIC'], 'All', 'FALSE'), 'FALSE'), 'FALSE')

谢谢!

标签: pythonif-statementconditional-statements

解决方案


您可以为此使用df.dot

df['CATEGORY'] = df.dot(df.columns + '_').str.rstrip('_').str.lower()

输出:

   PHYSICAL  SOCIAL  ECONOMIC                  CATEGORY
0         0       1         0                    social
1         0       1         1           social_economic
2         0       1         0                    social
3         0       0         1                  economic
4         1       1         1  physical_social_economic
5         1       1         0           physical_social

推荐阅读