首页 > 解决方案 > 比较 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']

我希望根据分类顺序比较衬衫尺寸。

标签: python-3.xpandasdataframecategoriescategorical-data

解决方案


使用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

推荐阅读