pandas分类数据


一、category的创建及其性质

1. 分类变量的创建

category的创建有多种形式:Series、DataFrame指定类型、内置Categorical类型、cut函数。

print(pd.Series(["a", "b", "c", "a"], dtype="category"))

temp_df = pd.DataFrame({'A':pd.Series(["a", "b", "c", "a"], dtype="category"),'B':list('abcd')})
print(temp_df.dtypes)

cat = pd.Categorical(["a", "b", "c", "a"], categories=['a','b','c'])
print(pd.Series(cat))

print(pd.cut(np.random.randint(0,60,5), [0,10,30,60], right=False, labels=['0-10','10-30','30-60']))

'''
0    a
1    b
2    c
3    a
dtype: category
Categories (3, object): ['a', 'b', 'c']
A    category
B      object
dtype: object
0    a
1    b
2    c
3    a
dtype: category
Categories (3, object): ['a', 'b', 'c']
['30-60', '0-10', '10-30', '30-60', '10-30']
Categories (3, object): ['0-10' < '10-30' < '30-60']
'''

2. 分类变量的结构

一个分类变量包括三个部分,元素值(values)、分类类别(categories)、是否有序(order)
从上面可以看出,使用cut函数创建的分类变量默认为有序分类变量
下面介绍如何获取或修改这些属性

describe方法
该方法描述了一个分类序列的情况,包括非缺失值个数、元素值类别数(不是分类类别数)、最多次出现的元素及其频数

s = pd.Series(pd.Categorical(["a", "b", "c", "a",np.nan], categories=['a','b','c','d']))
print(s.describe())

'''
count     4
unique    3
top       a
freq      2
dtype: object
'''

categories和ordered属性
查看分类类别和是否排序

print(s.cat.categories)

'''
Index(['a', 'b', 'c', 'd'], dtype='object')
'''

二、分类变量的排序

1. 序的建立

一般来说会将一个序列转为有序变量,可以利用as_ordered方法

s = pd.Series(["a", "d", "c", "a"]).astype('category').cat.as_ordered()
print(s)

'''
0    a
1    d
2    c
3    a
dtype: category
Categories (3, object): ['a' < 'c' < 'd']
'''

退化为无序变量,只需要使用as_unordered

print(s.cat.as_unordered())

'''
0    a
1    d
2    c
3    a
dtype: category
Categories (3, object): ['a', 'c', 'd']
'''

利用set_categories方法中的order参数

print(pd.Series(["a", "d", "c", "a"]).astype('category').cat.set_categories(['a','c','d'],ordered=True))

'''
0    a
1    d
2    c
3    a
dtype: category
Categories (3, object): ['a' < 'c' < 'd']
'''

利用reorder_categories方法

s = pd.Series(["a", "d", "c", "a"]).astype('category')
print(s.cat.reorder_categories(['a','c','d'],ordered=True))

'''
0    a
1    d
2    c
3    a
dtype: category
Categories (3, object): ['a' < 'c' < 'd']
'''

问题与习题

【问题一】 如何使用union_categoricals方法?它的作用是什么?

使用union_categoricals需要保证两个categories必须是相同的dtype。作用是把两个union_categoricals连接在一起


【问题二】 利用concat方法将两个序列纵向拼接,它的结果一定是分类变量吗?什么情况下不是?

​ 不一定,只有分类的数量和类别一样,才是分类变量

s = pd.Series(["a", "d", "c", "a"]).astype('category')
s1 = pd.Series(["a", "d", "c", "d"]).astype('category')
print(pd.concat([s, s1]))
'''
0    a
1    d
2    c
3    a
0    a
1    d
2    c
3    d
dtype: category
Categories (3, object): ['a', 'c', 'd']
'''
s = pd.Series(["a", "d", "c", "a"]).astype('category')
s1 = pd.Series(["a", "d", "c", "b"]).astype('category')
print(pd.concat([s, s1]))
'''
0    a
1    d
2    c
3    a
0    a
1    d
2    c
3    b
dtype: object
'''

【问题三】 当使用groupby方法或者value_counts方法时,分类变量的统计结果和普通变量有什么区别?
分类变量会转成对应的普通变量

【问题四】 下面的代码说明了Series创建分类变量的什么“缺陷”?如何避免?(提示:使用Series中的copy参数)
缺陷:修改series变量的时候,原分类跟着变了。
创建的时候设置参数copy=True,这样修改series的时候原分类就不会变了

cat = pd.Categorical([1, 2, 3, 10], categories=[1, 2, 3, 4, 10])
s = pd.Series(cat, name="cat", copy=True)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值