python-3.x - 比较 pandas.DataFrame 中列之间的分类变量
问题描述
如何使用设置的分类规则而不是词典顺序规则进行比较?
给定数据集:
df = pd.DataFrame({
'NUMBER':[12, 26, 16, 34, 38, 1, 26, 8],
'SHIRT_SIZE':['S', 'M', 'XL', 'L', 'S', 'M', 'L', 'XL'],
'SHIRT_SIZE2':['M', 'S', 'L', 'XL', 'M', 'L', 'XL', 'S']
})
from pandas.api.types import CategoricalDtype
c_dtype = CategoricalDtype(categories = ["S","M","L","XL"],ordered = True)
df['SHIRT_SIZE'] = df['SHIRT_SIZE'].astype(c_dtype)
df['SHIRT_SIZE2'] = df['SHIRT_SIZE2'].astype(c_dtype)
数字 | 衬衫尺码 | 衬衫尺寸2 | |
---|---|---|---|
0 | 12 | 小号 | 米 |
1 | 26 | 米 | 小号 |
2 | 16 | 特大号 | 大号 |
3 | 34 | 大号 | 特大号 |
4 | 38 | 小号 | 米 |
5 | 1 | 米 | 大号 |
6 | 26 | 大号 | 特大号 |
7 | 8 | 特大号 | 小号 |
的dtype
和是
我想比较两列之间的衬衫尺寸'SHIRT_SIZE'
和'SHIRT_SIZE2'
Categories (4, object): ['S' < 'M' < 'L' < 'XL']
'SHIRT_SIZE'
'SHIRT_SIZE2'
我尝试过:
def compare_size(row):
if (row['SHIRT_SIZE'] < row['SHIRT_SIZE2']):
return 'SMALLER'
elif (row['SHIRT_SIZE'] > row['SHIRT_SIZE2']):
return 'LARGER'
else:
return 'SAME'
df['COMPARE_SIZE'] = df.apply(lambda row: compare_size(row), axis=1)
导致:
数字 | 衬衫尺码 | 衬衫尺寸2 | COMPARE_SIZE | |
---|---|---|---|---|
0 | 12 | 小号 | 米 | 较大 |
1 | 26 | 米 | 小号 | 更小 |
2 | 16 | 特大号 | 大号 | 较大 |
3 | 34 | 大号 | 特大号 | 更小 |
4 | 38 | 小号 | 米 | 较大 |
5 | 1 | 米 | 大号 | 较大 |
6 | 26 | 大号 | 特大号 | 更小 |
7 | 8 | 特大号 | 小号 | 较大 |
请注意,有一些行,例如 'S' -> 'M' 的第 0 行和 'M' -> 'S' 的第 1 行不遵循我们的分类dtype
规则的顺序
从逻辑上讲,解释是:“SHIRT_SIZE is <COMPARE_SIZE> THAN SHIRT_SIZE2”
我猜测字符串的词典顺序是用于比较这些衬衫尺寸的基本规则,而不是我们在 where 设置的分类规则Categories (4, object): ['S' < 'M' < 'L' < 'XL']
。
我希望根据分类顺序比较衬衫尺寸。
解决方案
使用numpy select比较值并生成新列:
condlist = [df.SHIRT_SIZE.gt(df.SHIRT_SIZE2), df.SHIRT_SIZE.lt(df.SHIRT_SIZE2)]
result_list = ["LARGER", "SMALLER"]
compare_size = np.select(condlist, result_list, "SAME")
df.assign(compare_size=compare_size)
NUMBER SHIRT_SIZE SHIRT_SIZE2 compare_size
0 12 S M SMALLER
1 26 M S LARGER
2 16 XL L LARGER
3 34 L XL SMALLER
4 38 S M SMALLER
5 1 M L SMALLER
6 26 L XL SMALLER
7 8 XL S LARGER
推荐阅读
- javascript - 如何使用 jQuery 在源区域和目标区域之间移动 Draggable 对象
- java - 直接获取Base64输出,无需在desc中写入pdf
- java - Nestedscrollview 结束动画
- ubuntu - 个性化 Gitlab CE
- c# - c# - 如何将json数据存储到MySQL中
- c# - 将日期添加到日期选择器,然后将日期绑定到 Xamarin.Forms 中的 viewModel
- python - 无法从views.py 重定向
- angular - 角 6 NGRX;多重特征共享选择器
- java - 无法通过spark(2.7.7)客户端上传文件开火
- php - XMLHttpRequest 不加载jquery文件路径