用维度表表示重复的值
values=pd.Series(['apple','orange','lemon','apple']*2)
values
去重
pd.unique(values)
计算每个种类出现次数
pd.value_counts(values)
我们可以用不同的数字来编码不同的值
value=pd.Series([0,1,2,0]*2)
value
take用于恢复之前的字符串
dim=pd.Series(['apple','egg','orange'])
dim.take(value)
pandas中的Categorical data
pandas拥有特殊的Categorical类型,用于承载基于整数的类别展示或编码的数据。
首先我们先创建一个dataframe格式的数据
food=['bread','rice','apple','apple']*2
n=len(food)
df=pd.DataFrame({'foods':food,
'id':np.arange(n),
'count':np.random.randint(2,15,size=n),
'weight':np.random.uniform(0,4,size=n)},
columns=['id','foods','count','weight'])
df
Categorical Data数据的生成
由 codes和 categories组成,categories是有限且唯一的分类集合,codes是原数据对应的分类的编码,将数据类型变为Categorical data的三种方式:
(1)df某一列转换为Categorical对象
然后我们可以将某一列转换为Categorical对象,比如df[‘foods’]是一个字符串对象组成的数组,现在我们将它变为categorical,很简单只需要 调用astype
food_cat=df['foods'].astype('category')
food_cat
可以看到它的dtype变成category了 ,这个food_cat就是pandas.Categorical的实例
type(food_cat.values)
每一个Categorical对象都拥有categories和codes属性:
c=food_cat.values
c.categories
c.codes
(2)直接生成
除了将df的某一列转换,也可以直接生成category格式的数据,如:
cate=pd.Categorical(['foo','bar','foo','baz','bar'])
cate
(3) 函数构造
还可以根据已有的种类和编码,利用 from_codes函数构造,如:
cate1=['bar','lius','zoo']
codes=[0,0,1,2,0,2]
my_cate1=pd.Categorical.from_codes(codes,cate1)
my_cate1
使用 Categorical对象进行计算
假如有一些随机数字数据使用pandas.qcut分箱函数,结果会返回pandas.Categorical
np.random.seed(300)
draws=np.random.randn(1000)
draws[:5]
PS:
numpy.random.rand(d0,d1,…,dn)
- rand函数根据给定维度生成[0,1)之间的数据,包含0,不包含1
- dn表格每个维度
- 返回值为指定维度的array
numpy.random.randn(d0,d1,…,dn)
- randn函数返回一个或一组样本,具有标准正态分布。
- dn表格每个维度
- 返回值为指定维度的array
qcut中的数据都是服从正态分布的,所以这里用randn
计算上面数据的四分位数 ,如果不指定labels,也就是说每个箱体都没有名字,那么只好把箱体展现出来,即显示每个箱体的两个临界值
bins=pd.qcut(draws,4) #将数据均匀分成四份
bins
如果指定,如下:
bins=pd.cut(draws,4,labels=['Q1','Q2','Q3','Q4'])
bins
bins.codes[:10] #查看前10个编码表
使用category类型数据的好处是可以大量减少空间内存的浪费,试想看字符串数据转变为有0、1、2等的数字编码的数据,是不是轻松很多呢
draws=pd.Series(np.random.randn(100000))
labels=pd.Series(['abc','thy','awe','thr']*(100000//4))
labels
类别转换
cate=labels.astype('category')
cate
可以看到,内存占用明显小了许多 ,这是因为底层算法使用了基于整数代码的数组而不是字符串数组。
Original: https://blog.csdn.net/KK_1657654189/article/details/122576634
Author: 咩咩_10538769
Title: python之高阶pandas的使用(一)
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/752489/
转载文章受原作者版权保护。转载请注明原作者出处!