pandas变形函数
长表变宽表
povit() 函数
pivot 英语释义 = 中心点,中心事物。
计算机理解: 把数据的聚集到一个中心点, 长 变 宽 就是其中的一种形式
功能: 长表变宽表的函数
代码实战:
import pandas as pd
df = pd.DataFrame({'Class':[1,1,2,2],
'Name':['San Zhang','San Zhang','Si Li','Si Li'],
'Subject':['Chinese','Math','Chinese','Math'],
'Grade':[80,75,90,85]})
print(df)
print("*"*66)
print(df.pivot(index='Name', columns='Subject', values='Grade'))
运行结果:
Class Name Subject Grade
0 1 San Zhang Chinese 80
1 1 San Zhang Math 75
2 2 Si Li Chinese 90
3 2 Si Li Math 85
******************************************************************
Subject Chinese Math
Name
San Zhang 80 75
Si Li 90 85
从上面的我们可以知道:povit() 的 三大参数。
df.povit(index = "", columns = "" , values = "")
index = "" --> 新的行索引index = 原来的列表头
columns = "" --> 新的列表头 = 原来列的分类值(且这个值是**唯一的分类值**,不然会发生歧义,因为有多个,多个对应了不同的值,不知道往哪个分类值中进行填充。)
values = "" --> 新的值 = 除去充当columns的原来的值
以上这三个参数同样支持多级索引;
代码如下:
import pandas as pd
df = pd.DataFrame({'Class':[1, 1, 2, 2, 1, 1, 2, 2],
'Name':['San Zhang', 'San Zhang', 'Si Li', 'Si Li',
'San Zhang', 'San Zhang', 'Si Li', 'Si Li'],
'Examination': ['Mid', 'Final', 'Mid', 'Final',
'Mid', 'Final', 'Mid', 'Final'],
'Subject':['Chinese', 'Chinese', 'Chinese', 'Chinese',
'Math', 'Math', 'Math', 'Math'],
'Grade':[80, 75, 85, 65, 90, 85, 92, 88],
'rank':[10, 15, 21, 15, 20, 7, 6, 2]})
pivot_multi = df.pivot(index = ['Class', 'Name'],
columns = ['Subject','Examination'],
values = ['Grade','rank'])
print(pivot_multi)
运行效果:
Grade rank
Subject Chinese Math Chinese Math
Examination Mid Final Mid Final Mid Final Mid Final
Class Name
1 San Zhang 80 75 90 85 10 15 20 7
2 Si Li 85 65 92 88 21 15 6 2
注意:
根据唯一性原则,新表的行索引等价于对 index 中的多列使用 drop_duplicates ,而列索引的长度为 values中的元素个数乘以 columns 的唯一组合数量(与 index 类似)。
如果不满足唯一性条件,那么必须通过聚合操作使得相同行列组合对应的多个值变为一个值。
代码实例:
import pandas as pd
df = pd.DataFrame({'Name':['San Zhang', 'San Zhang',
'San Zhang', 'San Zhang',
'Si Li', 'Si Li', 'Si Li', 'Si Li'],
'Subject':['Chinese', 'Chinese', 'Math', 'Math',
'Chinese', 'Chinese', 'Math', 'Math'],
'Grade':[80, 90, 100, 90, 70, 80, 85, 95]})
df.pivot(index="Name", columns="Subject", values="Grade")
运行结果(错误显示):
ValueError: Index contains duplicate entries, cannot reshape
这里的 Name 是多个分类值,pivot() 函数难以处理多分类值进行转换成宽表
povit_table() 函数
为了解决变形函数 pivot() 难以处理多分类值的这种现象,我们在这里引入:povit_table() 函数
import pandas as pd
df = pd.DataFrame({'Name':['San Zhang', 'San Zhang',
'San Zhang', 'San Zhang',
'Si Li', 'Si Li', 'Si Li', 'Si Li'],
'Subject':['Chinese', 'Chinese', 'Math', 'Math',
'Chinese', 'Chinese', 'Math', 'Math'],
'Grade':[80, 90, 100, 90, 70, 80, 85, 95]})
print(df.pivot_table(index="Name", columns="Subject", values="Grade"))
运行结果:
Subject Chinese Math
Name
San Zhang 85 95
Si Li 75 90
针对分类值进行函数操作的方法:
代码实战:
print(df.pivot_table(index="Name", columns="Subject", values="Grade", aggfunc="mean"))
运行结果:
Subject Chinese Math
Name
San Zhang 85 95
Si Li 75 90
虽然两处的运行结果一样,但是含义确不一样,
aggfunc = "聚合函数" = aggerate function
是针对多个类别使用去使用函数
再比如:
print(df.pivot_table(index="Name", columns="Subject", values="Grade", aggfunc="sum"))
运行结果:
Subject Chinese Math
Name
San Zhang 170 190
Si Li 150 180
此处的聚合函数方法具体可参照:
(聚合函数章节)
宽表变长表
melt() 函数
melt = 熔化,融化
计算机理解:融化了之后,就扩散了,因此变长了。
功能: 将宽表变成长表
代码实战:
df = pd.DataFrame({'Class':[1,2],
'Name':['San Zhang', 'Si Li'],
'Chinese':[80, 90],
'Math':[80, 75]})
df_melted = df.melt(id_vars = ['Class', 'Name'],
value_vars = ['Chinese', 'Math'],
var_name = 'Subject',
value_name = 'Grade')
print(df)
print("*"*66)
print(df_melted)
运行结果:
Class Name Chinese Math
0 1 San Zhang 80 80
1 2 Si Li 90 75
******************************************************************
Class Name Subject Grade
0 1 San Zhang Chinese 80
1 2 Si Li Chinese 90
2 1 San Zhang Math 80
3 2 Si Li Math 75
根据上述可知:
melted的四大参数:
id_vars = 列名
value_vars = 作为宽表的列类别
var_name = 作为长表的列名
value_name = 原列变量的值
注意:
上面的 povit() 和 melt() 函数参数的对比。
在列索引中被压缩的一组值对应的列元素只能代表同一层次的含义
wide_to_long()函数
为了解决上面的只能代表同一层含义,因此引入wide_to_long()的函数。
df = pd.DataFrame({'Class':[1,2],'Name':['San Zhang', 'Si Li'],
'Chinese_Mid':[80, 75], 'Math_Mid':[90, 85],
'Chinese_Final':[80, 75], 'Math_Final':[90, 85]})
pd.wide_to_long(df,
stubnames=['Chinese', 'Math'],
i = ['Class', 'Name'],
j='Examination',
sep='_',
suffix='.+')
运行结果:
Chinese Math
Class Name Examination
1 San Zhang Mid 80 90
Final 80 90
2 Si Li Mid 75 85
Final 75 85
从结果看,参数的含义是:
pd.wide_to_long(df, stubnames = ["待处理的分类类别1", "待处理的分类类别2", "", ……],
i = ["列表头元素1", "列表头元素2", "", ……],
j = "待处理类别的所属类别",
sep = "怎样把待处理类别分隔开来",
suffix= "正则后缀")
正则后缀:是行索引压缩到列名时,需要符合什么样的条件。
其他变形函数
crosstab()
crosstab() 功能和 povit_table() 差不多,首选 povit_table()
注意使用形式上的区别:
pd.crosstab()
df.povit_table()
使用方法:
import pandas as pd
path = r"F:\Python_Tensorflow_codes\001竞赛代码\joyful-pandas-master\data\learn_pandas.csv"
df = pd.read_csv(path, encoding="gbk")
a = pd.crosstab(index=df["School"], columns=df["Transfer"],
values=df["Height"], aggfunc="mean")
# b = pd.pivot_table(index=df["School"], columns=df["Transfer"],
# values=df["Height"], aggfunc="mean")
# c = df.crosstab(index="School", columns="Transfer",
# values="Height", aggfunc="mean")
d = df.pivot_table(index="School", columns="Transfer",
values="Height", aggfunc="mean")
print(a)
print("*"*66)
# print(b)
# print("*"*66)
# print(c)
# print("*"*66)
print(d)
注意:其中的 b 和 c 都是错误使用的形式。
运行结果:
Transfer N Y
School
Fudan University 162.043750 177.20
Peking University 163.429630 162.40
Shanghai Jiao Tong University 163.953846 NaN
Tsinghua University 163.253571 164.55
******************************************************************
Transfer N Y
School
Fudan University 162.043750 177.20
Peking University 163.429630 162.40
Shanghai Jiao Tong University 163.953846 NaN
Tsinghua University 163.253571 164.55
explode()
explode 参数能够对某一列的元素进行纵向的展开,被展开的单元格必须存储 list, tuple, Series, np.ndarray 中的一种类型。
代码实战:
df_ex = pd.DataFrame({'A': [[1, 2], 'my_str', {1, 2}, pd.Series([3, 4])],
'B': 1})
df_ex.explode("A")
print(df_ex.explode("A"))
运行结果:
A B
0 1 1
0 2 1
1 my_str 1
2 {1, 2} 1
3 3 1
3 4 1
get_dummies()
get_dummies 是用于特征构建的重要函数之一,其作用是把类别特征转为指示变量。
代码实战:
pd.get_dummies(df.Grade).head()
运行结果:
Freshman Junior Senior Sophomore
0 1 0 0 0
1 1 0 0 0
2 0 0 1 0
3 0 0 0 1
4 0 0 0 1
这种形式像极了亚编码(one-hot独热编码)