Python--pandas-3
Series层次化索引
层次化索引可以使一个轴上拥有多个索引
import numpy as np
import pandas as pd
df = pd.Series(np.arange(1,10),index=[['a','a','a','b','b','c','c','d','d'],[1,2,3,1,2,3,1,2,3]])
print(df)
# a 1 1
# 2 2
# 3 3
# b 1 4
# 2 5
# c 3 6
# 1 7
# d 2 8
# 3 9
print(df.index)
# MultiIndex([('a', 1),
# ('a', 2),
# ('a', 3),
# ('b', 1),
# ('b', 2),
# ('c', 3),
# ('c', 1),
# ('d', 2),
# ('d', 3)],
# )
# 外层索引
print(df['a'])
# 1 1
# 2 2
# 3 3
# 外层索引切片
print(df['a':'c'])
# a 1 1
# 2 2
# 3 3
# b 1 4
# 2 5
# c 3 6
# 1 7
# 外层索引与内层索引共同使用
# 表示外层从头到尾,内层索引为1的数据
print(df[:,1])
# a 1
# b 4
# c 7
#外层索引为c,内层索引为3的数据
print(df['c',3])
# 6
使用unstack方法将Series变成一个DataFrame
stack方法可以将DataFrame变成Series

DataFrame层次化索引
对于DataFrame来说,行和列都可以进行层次化索引
import numpy as np
import pandas as pd
df = pd.DataFrame(np.arange(12).reshape(4,3),index=[['a','a','b','b'],[1,2,1,2]],columns=[['A','A','B'],['Z','X','C']])
print(df)
# A B
# Z X C
# a 1 0 1 2
# 2 3 4 5
# b 1 6 7 8
# 2 9 10 11
# 外层索引
print(df['A'])
# Z X
# a 1 0 1
# 2 3 4
# b 1 6 7
# 2 9 10
# 设置行列索引的名称
df.index.names = ['row1','row2']
df.columns.names = ['col1','col2']
print(df)
# col1 A B
# col2 Z X C
# row1 row2
# a 1 0 1 2
# 2 3 4 5
# b 1 6 7 8
# 2 9 10 11
df=df.swaplevel('索引名1','索引名2'),当数据有双层索引时该方法可以将内外索引调换位置
set_index方法可以将列变成索引,例如原本数据某列为班级,使用该方法后班级变成索引,就可以根据班级进行筛选所需数据
reset_index方法可以将所有变成列
注意:每一个索引都是一个元组
使用.T可以将数据的行列进行转换
dataframe也可以使用stack和unstack,转换成层次化索引的Series
import numpy as np
import pandas as pd
df = pd.read_excel("E:/test_data.xlsx")
df = df.set_index(['班级'])
print(df)
# 序号 姓名 年龄 性别
# 班级
# 1班 1 张三1 18 男
# 2班 2 张三2 19 男
# 1班 3 张三3 18 男
# 3班 4 张三4 29 男
# 2班 5 张三5 28 男
# 1班 6 张三6 17 男
# 2班 7 张三7 18 男
# 1班 8 张三8 18 男
# 1班 9 张三9 19 男
# 1班 10 张三10 18 男
print(df.loc['1班'])
# 序号 姓名 年龄 性别
# 班级
# 1班 1 张三1 18 男
# 1班 3 张三3 18 男
# 1班 6 张三6 17 男
# 1班 8 张三8 18 男
# 1班 9 张三9 19 男
# 1班 10 张三10 18 男
print(df.reset_index())
# 班级 序号 姓名 年龄 性别
# 0 1班 1 张三1 18 男
# 1 2班 2 张三2 19 男
# 2 1班 3 张三3 18 男
# 3 3班 4 张三4 29 男
# 4 2班 5 张三5 28 男
# 5 1班 6 张三6 17 男
# 6 2班 7 张三7 18 男
# 7 1班 8 张三8 18 男
# 8 1班 9 张三9 19 男
# 9 1班 10 张三10 18 男
print(df.T)
# 班级 1班 2班 1班 3班 2班 1班 2班 1班 1班 1班
# 序号 1 2 3 4 5 6 7 8 9 10
# 姓名 张三1 张三2 张三3 张三4 张三5 张三6 张三7 张三8 张三9 张三10
# 年龄 18 19 18 29 28 17 18 18 19 18
# 性别 男 男 男 男 男 男 男 男 男 男
print(df.stack())
# 班级
# 1班 序号 1
# 姓名 张三1
# 年龄 18
# 性别 男
# 2班 序号 2
# 姓名 张三2
# 年龄 19
# 性别 男
# 1班 序号 3
# 姓名 张三3
# 年龄 18
# 性别 男
# 3班 序号 4
# 姓名 张三4
# 年龄 29
# 性别 男
# 2班 序号 5
# 姓名 张三5
# 年龄 28
# 性别 男
# 1班 序号 6
# 姓名 张三6
# 年龄 17
# 性别 男
# 2班 序号 7
# 姓名 张三7
# 年龄 18
# 性别 男
# 1班 序号 8
# 姓名 张三8
# 年龄 18
# 性别 男
# 序号 9
# 姓名 张三9
# 年龄 19
# 性别 男
# 序号 10
# 姓名 张三10
# 年龄 18
# 性别 男
数据分组和分组运算
GroupBy技术:实现数据的分组,和分组运算,作用类似于数据透视表

注意:只会对数值变量进行分组运算
import numpy as np
import pandas as pd
df = pd.read_excel("E:/test_data.xlsx")
group = df.groupby(df['班级'])
print(group)
# 计算分组后的各个统计量
# 参数numeric_only=True表示只计算数值列的平均值
print(group.mean(numeric_only=True))
# 序号 年龄
# 班级
# 1班 6.166667 18.000000
# 2班 4.666667 21.666667
# 3班 4.000000 29.000000
print(group.sum(numeric_only=True))
# 序号 年龄
# 班级
# 1班 37 108
# 2班 14 65
# 3班 4 29
# 按照班级查看平均年龄
data = df['年龄'].groupby(df['班级']).mean()
print(data)
# 班级
# 1班 18.000000
# 2班 21.666667
# 3班 29.000000
# 传入多个分组变量
print(df.groupby([df['年龄'],df['性别']]).mean(numeric_only=True))
# 序号
# 年龄 性别
# 17 男 6.0
# 18 男 5.8
# 19 男 5.5
# 28 男 5.0
# 29 男 4.0
# 查看某一值时使用groupby
print(df['年龄'].groupby([df['班级'],df['性别']]).mean())
# 班级 性别
# 1班 男 18.000000
# 2班 男 21.666667
# 3班 男 29.000000
离散化处理
在实际的数据分析项目中,对有的数据属性,我们往往并不关注数据的绝对取值,只关注它所处的区间或者等级。
比如,我们可以把评分9分及以上的电影定义为A,7到9分定义为B,5到7分定义为C,3到5分定义为D,小于3分定义为E。
离散化也可称为分组、区间化。
Pandas为我们提供了方便的函数cut():
pd.cut(x, bins, right=True, labels=None, retbins=False, precision=3, include_lowest=False) 参数解释:
x:需要离散化的数组、Series、DataFrame对象
bins:分组的依据
right:区间是否包括右端点,默认包括
include_lowest:是否包括左端点,默认不包括
import numpy as np
import pandas as pd
df = pd.read_excel("E:/test_data.xlsx")
data = pd.cut(df['年龄'],[12,15,20,30],labels=['C','B','A'])
print(data)
# 0 B
# 1 B
# 2 B
# 3 A
# 4 A
# 5 C
# 6 C
# 7 C
# 8 B
# 9 B
# Name: 年龄, dtype: category
# Categories (3, object): ['C' < 'B' < 'A']
合并数据集
_append方法合并两个数据集
concat方法,默认为行连接
pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None,left_index=False, right_index=False, sort=True,suffixes=('_x', '_y'), copy=True, indicator=False)
left:对象
right:另一个对象
on:要加入的列(名称)。必须在左、右综合对象中找到。如果不能通过 left_index 和 right_index 是假,将推断 DataFrames 中的列的交叉点为连接键
left_on:从左边的综合使用作为键列。可以是列名或数组的长度等于长度综合
right_on:从正确的综合,以用作键列。可以是列名或数组的长度等于长度综合
left_index:如果为 True,则使用索引(行标签)从左综合作为其联接键。在与多重(层次)的综合,级别数必须匹配联接键从右综合的数目
right_index:相同用法作为正确综合 left_index
how:之一'左', '右', '外在'、'内部'。默认为内部。每个方法的更详细说明请参阅:
sort:综合通过联接键按字典顺序对结果进行排序。默认值为 True,设置为 False将提高性能极大地在许多情况下
suffixes:字符串后缀并不适用于重叠列的元组。默认值为 ('_x', '_y')。
copy:即使重新索引是不必要总是从传递的综合对象,复制的数据(默认值True)。在许多情况下不能避免,但可能会提高性能 / 内存使用情况。可以避免复制上述案件有些病理但尽管如此提供此选项。
indicator:将列添加到输出综合呼吁 _merge 与信息源的每一行。_merge 是绝对类型,并对观测其合并键只出现在 '左' 的综合,观测其合并键只会出现在 '正确' 的综合,和两个如果观察合并关键发现在两个 right_only left_only 的值。
import numpy as np
import pandas as pd
df = pd.read_excel("E:/test_data.xlsx")
df_1 = df[df.班级=='1班']
df_2 = df[df.班级=='2班']
print(df_1)
print(df_2)
# 序号 姓名 年龄 性别 班级
# 0 1 张三1 18 男 1班
# 2 3 张三3 18 男 1班
# 5 6 张三6 15 男 1班
# 7 8 张三8 15 男 1班
# 8 9 张三9 19 男 1班
# 9 10 张三10 18 男 1班
# 序号 姓名 年龄 性别 班级
# 1 2 张三2 19 男 2班
# 4 5 张三5 28 男 2班
# 6 7 张三7 14 男 2班
# _append合并
df_3 = df_2._append(df_1)
print(df_3)
# 序号 姓名 年龄 性别 班级
# 1 2 张三2 19 男 2班
# 4 5 张三5 28 男 2班
# 6 7 张三7 14 男 2班
# 0 1 张三1 18 男 1班
# 2 3 张三3 18 男 1班
# 5 6 张三6 15 男 1班
# 7 8 张三8 15 男 1班
# 8 9 张三9 19 男 1班
# 9 10 张三10 18 男 1班
df_4 = pd.concat([df_1, df_2])
print(df_4)
# 序号 姓名 年龄 性别 班级
# 0 1 张三1 18 男 1班
# 2 3 张三3 18 男 1班
# 5 6 张三6 15 男 1班
# 7 8 张三8 15 男 1班
# 8 9 张三9 19 男 1班
# 9 10 张三10 18 男 1班
# 1 2 张三2 19 男 2班
# 4 5 张三5 28 男 2班
# 6 7 张三7 14 男 2班更多推荐


所有评论(0)