标签:rand 练习 计数 关系 设置 class head index 完成
一般状态下,数据在DataFrame会以压缩(stacked)状态存放,例如上面的Gender,两个类别被叠在一列中。pivot_table函数可将某一原列转为新列,新列中的值由其他列确定。请体会pivot_table函数中参数的作用:
df.pivot(index=‘ID‘,columns=‘Gender‘,values=‘Height‘).head()
# 将columns的值展开,填入指定的values
pd.pivot_table(df, index=‘ID‘,columns=‘Gender‘,values=‘Height‘).head()
其他一些常用的参数:
pd.pivot_table(df,index=‘School‘,columns=‘Gender‘,values=‘Height‘,aggfunc=[‘mean‘,‘sum‘], margins=True).head()
# 默认 margins_name=‘All‘
pd.pivot_table(df,index=[‘School‘,‘Class‘],
columns=[‘Gender‘,‘Address‘],
values=[‘Height‘,‘Weight‘])
交叉表是一种特殊的透视表,典型的用途如分组统计。下面统计街道和性别分组的频数:
pd.crosstab(index=df[‘Address‘], columns=df[‘Gender‘])
crosstab函数的一些重要参数:
pd.crosstab(index=df[‘Address‘],columns=df[‘Gender‘],
values=np.random.randint(1,20,df.shape[0]),aggfunc=‘min‘)
#默认参数等于如下方法:
#pd.crosstab(index=df[‘Address‘],columns=df[‘Gender‘],values=1,aggfunc=‘count‘)
交叉表的默认函数中,默认为计数方法,此处实验采用的min方法,相信你可以比较出他们的不同,以及理解values和aggfunc成对出现的原因:
normalize与margins也是成对出现的,归一化的值需要在边际上呈现。
pd.crosstab(index=df[‘Address‘], columns=df[‘Gender‘],normalize=‘all‘,margins=True,margins_name=‘归一化‘)
melt函数可以认为是pivot函数的逆操作,将unstacked状态的数据,压缩成stacked,使“宽”的DataFrame变“窄”。melt中的参数变量id_vars表示需要保留的列,value_vars表示需要stack的一组列。
# 展开Gender这一列,并将Math列中的值赋给新列
pivoted = df.pivot(index=‘ID‘,columns=‘Gender‘,values=‘Math‘)
# 保留ID列,合并F、M列为一列,value_vars设置,然后去除空值列...
result = pivoted.reset_index().melt(id_vars=[‘ID‘],value_vars=[‘F‘,‘M‘],value_name=‘新Math‘).dropna().set_index(‘ID‘).sort_index()
display(result.head())、
#检验是否与展开前的df相同,可以分别将这些链式方法的中间步骤展开,看看是什么结果
# result.equals(df_m.set_index(‘ID‘))
(1)stack:这是最基础的变形函数,总共只有两个参数:level和dropna
stack函数可以看做将横向的索引放到纵向,因此功能类似与melt,参数level可指定变化的列索引是哪一层(或哪几层,需要列表)
(2) unstack:stack的逆函数,功能上类似于pivot_table
get_dummies函数的功能主要是进行one-hot编码。接下来,将Class、Gender变量转化为哑变量,并加入第三列Weight的数值:
df_d = df[[‘Class‘,‘Gender‘,‘Weight‘]]
pd.get_dummies(df_d[[‘Class‘,‘Gender‘]]).join(df_d[‘Weight‘]).head()
# 可选prefix参数添加前缀,prefix_sep添加分隔符
factorize方法主要用于自然数编码,缺失值被记为-1,sort参数表示是否排序后赋值:
codes, uniques = pd.factorize([‘b‘, None, ‘a‘, ‘c‘, ‘b‘], sort=True)
display(codes)
display(uniques)
array([ 1, -1, 0, 2, 1]) array([‘a‘, ‘b‘, ‘c‘], dtype=object)
【问题一】 上面提到了许多变形函数,如melt/crosstab/pivot/pivot_table/stack/unstack函数,请总结它们各自的使用特点。
【问题二】 变形函数和多级索引是什么关系?哪些变形函数会使得索引维数变化?具体如何变化?
【问题三】 请举出一个除了上文提过的关于哑变量方法的例子。
【问题四】 使用完stack后立即使用unstack一定能保证变化结果与原始表完全一致吗?
【问题五】 透视表中涉及了三个函数,请分别使用它们完成相同的目标(任务自定)并比较哪个速度最快。
【问题六】 既然melt起到了stack的功能,为什么再设计stack函数?
标签:rand 练习 计数 关系 设置 class head index 完成
原文地址:https://www.cnblogs.com/youdef/p/12797793.html