datawhale组对学习——pandas基础下——分类数据

学习资源链接分类数据

一、总览

在这里插入图片描述

二、疑问

1.不懂下面的这个是怎么创建出来的,创建出来之后是用来干什么的。在这里插入图片描述
2.在这里为什么更改类型之后里面的元素值是改变了的,并且为什么只改变了这里面abca中的aba,没有改变那个c。在这里插入图片描述
解答:因为他在这里更改了类型,但是c的类型还是没有变,所以前面的那个c就不会变成nan,其他的就会变成nan,因为原先的类型变了。
3.这里前面的abca是指元素值,后面的那个abcd是指元素类型吗?并且后面的那个abcd可不可以写成efgh之类的,只是一个类型的名称而已?在这里插入图片描述
对于上面的解答:如果后面没有前面相应的值,就不会被创建出来。
在这里插入图片描述

4.对于前面提到的分类数据类型被分为有序和无序,这非常好理解,例如分数区间的高低是有序变量,考试科目的类别一般看做无序变量。

5.不懂这里为什么要用cat,难道cat在这里的作用就是把abc链接起来,然后排序的时候就好排序是吗?我猜大概就是这样的。在这里插入图片描述
6.在这里插入图片描述

三、思考题

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

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

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

【问题四】 下面的代码说明了Series创建分类变量的什么“缺陷”?如何避免?(提示:使用Series中的copy参数)

在这里插入图片描述

四、练习题

【练习一】 现继续使用第四章中的地震数据集,请解决以下问题:

(a)现在将深度分为七个等级:[0,5,10,15,20,30,50,np.inf],请以深度等级Ⅰ,Ⅱ,Ⅲ,Ⅳ,Ⅴ,Ⅵ,Ⅶ为索引并按照由浅到深的顺序进行排序。
(b)在(a)的基础上,将烈度分为4个等级:[0,3,4,5,np.inf],依次对南部地区的深度和烈度等级建立多级索引排序。
这里用到的应该是对dataframe的处理,然后再用pandas上里面的排序来进行操作。

df = pd.read_csv('F:/program study/python/joyful-pandas-master/data/Earthquake.csv')
df.head()

df_a = df.copy()
df_a['深度'] = pd.cut(df_a['深度'], [0,5,10,15,20,30,50,np.inf],labels=['Ⅰ','Ⅱ','Ⅲ','Ⅳ','Ⅴ','Ⅵ','Ⅶ'])
df_a.set_index('深度').sort_index().head()

df_a['烈度'] = pd.cut(df_a['烈度'], [-1e-10,3,4,5,np.inf],labels=['Ⅰ','Ⅱ','Ⅲ','Ⅳ'])
df_a.set_index(['深度','烈度']).sort_index().head()

【练习二】 对于分类变量而言,调用第4章中的变形函数会出现一个BUG(目前的版本下还未修复):例如对于crosstab函数,按照官方文档的说法,即使没有出现的变量也会在变形后的汇总结果中出现,但事实上并不是这样,比如下面的例子就缺少了原本应该出现的行’c’和列’f’。基于这一问题,请尝试设计my_crosstab函数,在功能上能够返回正确的结果。

这个真不会,不会Python呀,直接拿来了参考答案。

foo = pd.Categorical(['a', 'b'], categories=['a', 'b', 'c'])
bar = pd.Categorical(['d', 'e'], categories=['d', 'e', 'f'])
pd.crosstab(foo, bar)


def my_crosstab(foo,bar):
    num = len(foo)
    s1 = pd.Series([i for i in list(foo.categories.union(set(foo)))],name='1nd var')
    s2 = [i for i in list(bar.categories.union(set(bar)))]
    df = pd.DataFrame({i:[0]*len(s1) for i in s2},index=s1)
    for i in range(num):
        df.at[foo[i],bar[i]] += 1
    return df.rename_axis('2st var',axis=1)
my_crosstab(foo,bar)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章