python - 根据布尔条件分配类别
问题描述
我试图弄清楚是否有更好的方法来根据条件对数据进行分类。
示例数据: 查看已识别的地点是否具有物理、社会和/或经济角色。如果存在任何/许多角色,则该位置标记为“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')
谢谢!
解决方案
您可以为此使用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
推荐阅读
- r - Rbind 不携带空 data.frame 的 colnames
- php - 带有绑定参数的大型查询导致Doctrine中的参数号无效错误
- asp.net-mvc-5 - How do I format a db string field to uppercase in either an mvc5 view or model. Cant get ToUpper to work
- c# - (C# 表单)无法使撤消按钮实际工作
- javascript - HTML - 如何使用 javascript 在输入日期中添加天数?
- tensorflow - tf.unstack 不适用于 tf 1.8 CudnnGRU 张量
- javascript - jQuery拖放:拖动封闭元素
- scipy - 如何以更高的精度返回 scipy 区间
- bootstrap-4 - 占用整个窗口空间
- angular - Angular-6 无法在登录页面和注册页面中隐藏应用页眉和页脚