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班
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐