pandas学习(数据分组与分组运算、离散化处理、数据合并)

时间:2022-08-03 04:11:45

pandas学习(数据分组与分组运算、离散化处理、数据合并)

目录

数据分组与分组运算

离散化处理

 数据合并

数据分组与分组运算

GroupBy技术:实现数据的分组,和分组运算,作用类似于数据透视表

数据分组--〉归纳

  

程序示例

import numpy as np
import pandas as pd
# 读入数据
df=pd.read_csv('data1.txt')
print('原始数据')
print(df) #返回一个对象 group=df.groupby(df['产地']) #计算分组后的各个统计值
print('根据产地进行分组')
print(group.mean())
print(group.sum()) # 只计算某列的结果
print('根据年代进行分组,然后统计每一个年代的平均评分')
print(df['评分'].groupby(df['年代']).mean()) #根据多个分组变量进行分组
print('多个分组变量进行分组')
print(df.groupby([df['产地'],df['年代']]).mean()) #获得每一个地区,每一年的电影的评分的均值
print('多个分组变量进行分组之操作某列')
print(df['评分'].groupby([df['产地'],df['年代']]).mean())

  

运行结果

原始数据
名字 投票人数 类型 产地 上映时间 时长 年代 评分
0 美丽人生 42995 剧情/喜剧/爱情 意大利 1997-12-20 116 1997 9.5
1 阿甘正传 580897 剧情/爱情 美国 1994-06-23 142 1994 9.4
2 肖申克的救赎 692795 剧情/犯罪 美国 1994-09-10 142 1994 9.6
3 控方证人 42995 剧情/悬疑/犯罪 美国 1957-12-17 116 1957 9.5
4 霸王别姬 478523 剧情/爱情/同性 * 1993-01-01 171 1993 9.4
根据产地进行分组
投票人数 时长 年代 评分
产地
* 478523.000000 171.000000 1993.000000 9.4
意大利 42995.000000 116.000000 1997.000000 9.5
美国 438895.666667 133.333333 1981.666667 9.5
投票人数 时长 年代 评分
产地
* 478523 171 1993 9.4
意大利 42995 116 1997 9.5
美国 1316687 400 5945 28.5 根据年代进行分组,然后统计每一个年代的平均评分
年代
1957 9.5
1993 9.4
1994 9.5
1997 9.5
Name: 评分, dtype: float64 多个分组变量进行分组
投票人数 时长 评分
产地 年代
* 1993 478523 171 9.4
意大利 1997 42995 116 9.5
美国 1957 42995 116 9.5
1994 636846 142 9.5 多个分组变量进行分组之操作某列
产地 年代
* 1993 9.4
意大利 1997 9.5
美国 1957 9.5
1994 9.5
Name: 评分, dtype: float64

  

  

离散化处理

#在实际的数据分析项目中,对有数据属性,我们往往并不是关注数据的绝对数值,只关注它所处的区间或者等级
# 比如,我们可以把评分9分及以上的电影定义为A,7到9分为B,5到7分定义为C,3到5分定义为D,小于3分定义为E
#离散化也被称为分组,区间化
#pandas为我们提供了方便的函数cut()
# pandas.cut( x , bins , right=True , labels=None , retbins=False , precision=3 , include_lowest=False,duplicates='raise')
#  参数说明: 
#
#      x    : 进行划分的一维数组;
#      bins :如果是整数---将x划分为多少个等间距的区间,如代码一;
#      bins :如果是序列,则将x划分在指定的序列中,若不在该序列中,则是NaN ,如代码二;
#      right : 是否包含右端点;
#      labels : 是否用标记来代替返回的bins,如代码三;
#      retbins: 是否返回间距bins,如果retbins = False 则返回x中每个值对应的bin的列表,否者则返回x中每个值对应的bin的列表和对应的bins;
#      precision: 精精度;
#      include_lowest:是否包含左端点; 

程序示例

import numpy as np
import pandas as pd
# 读入数据
df=pd.read_csv('data1.txt')
print('原始数据')
print(df)
data=pd.cut(df['评分'],[0,3,5,7,9,10],labels=['E','D','C','B','A'])
print(data)
df['等级']=data
print(df)

  

运行结果

原始数据
名字 投票人数 类型 产地 上映时间 时长 年代 评分
0 美丽人生 42995 剧情/喜剧/爱情 意大利 1997-12-20 116 1997 9.5
1 阿甘正传 580897 剧情/爱情 美国 1994-06-23 142 1994 9.4
2 肖申克的救赎 692795 剧情/犯罪 美国 1994-09-10 142 1994 9.6
3 控方证人 42995 剧情/悬疑/犯罪 美国 1957-12-17 116 1957 9.5
4 霸王别姬 478523 剧情/爱情/同性 * 1993-01-01 171 1993 9.4
0 A
1 A
2 A
3 A
4 A
Name: 评分, dtype: category
Categories (5, object): [E < D < C < B < A]
名字 投票人数 类型 产地 上映时间 时长 年代 评分 等级
0 美丽人生 42995 剧情/喜剧/爱情 意大利 1997-12-20 116 1997 9.5 A
1 阿甘正传 580897 剧情/爱情 美国 1994-06-23 142 1994 9.4 A
2 肖申克的救赎 692795 剧情/犯罪 美国 1994-09-10 142 1994 9.6 A
3 控方证人 42995 剧情/悬疑/犯罪 美国 1957-12-17 116 1957 9.5 A
4 霸王别姬 478523 剧情/爱情/同性 * 1993-01-01 171 1993 9.4 A

 

数据合并

append(上下拼接)

import numpy as np
import pandas as pd
# 读入数据
df=pd.read_csv('data1.txt')
print('原始数据')
print(df) # (1)append(上下拼接)
# 先把数据集拆分为多个,再进行合并
df_1=df[df.产地 =="美国"]
df_2=df[df.产地 == "*"] df_3=df_1.append(df_2)#append()
print(df_3)

  

原始数据
名字 投票人数 类型 产地 上映时间 时长 年代 评分
0 美丽人生 42995 剧情/喜剧/爱情 意大利 1997-12-20 116 1997 9.5
1 阿甘正传 580897 剧情/爱情 美国 1994-06-23 142 1994 9.4
2 肖申克的救赎 692795 剧情/犯罪 美国 1994-09-10 142 1994 9.6
3 控方证人 42995 剧情/悬疑/犯罪 美国 1957-12-17 116 1957 9.5
4 霸王别姬 478523 剧情/爱情/同性 * 1993-01-01 171 1993 9.4 #合并后的数据
名字 投票人数 类型 产地 上映时间 时长 年代 评分
1 阿甘正传 580897 剧情/爱情 美国 1994-06-23 142 1994 9.4
2 肖申克的救赎 692795 剧情/犯罪 美国 1994-09-10 142 1994 9.6
3 控方证人 42995 剧情/悬疑/犯罪 美国 1957-12-17 116 1957 9.5
4 霸王别姬 478523 剧情/爱情/同性 * 1993-01-01 171 1993 9.4

merge (左右合并)

# merge: 合并数据集, 通过left, right确定连接字段,默认是两个数据集相同的字段
# 参数 说明
# left 参与合并的左侧DataFrame
# right 参与合并的右侧DataFrame
# how 连接方式:‘inner’(默认);还有,‘outer’、‘left’、‘right’
# on 用于连接的列名,必须同时存在于左右两个DataFrame对象中,如果位指定,则以left和right列名的交集作为连接键
# left_on 左侧DataFarme中用作连接键的列
# right_on 右侧DataFarme中用作连接键的列
# left_index 将左侧的行索引用作其连接键
# right_index 将右侧的行索引用作其连接键
# sort 根据连接键对合并后的数据进行排序,默认为True。有时在处理大数据集时,禁用该选项可获得更好的性能
# suffixes 字符串值元组,用于追加到重叠列名的末尾,默认为(‘_x’,‘_y’).例如,左右两个DataFrame对象都有‘data’,则结果中就会出现‘data_x’,‘data_y’
# copy 设置为False,可以在某些特殊情况下避免将数据复制到结果数据结构中。默认总是赋值
# ”’
#有朋友总结了使用,所以直接引用了
# https://www.cnblogs.com/lijinze-tsinghua/p/9878649.html

concat():

批量数据合并(两个数据及以上)

上下合并

import numpy as np
import pandas as pd
# 读入数据
df=pd.read_csv('data1.txt')
print('原始数据')
print(df) # (1)append(上下拼接)
# 先把数据集拆分为多个,再进行合并
df_1=df[df.产地 =="美国"]
df_2=df[df.产地 == "*"] print(pd.concat([df_1,df_2]))

  

原始数据
名字 投票人数 类型 产地 上映时间 时长 年代 评分
0 美丽人生 42995 剧情/喜剧/爱情 意大利 1997-12-20 116 1997 9.5
1 阿甘正传 580897 剧情/爱情 美国 1994-06-23 142 1994 9.4
2 肖申克的救赎 692795 剧情/犯罪 美国 1994-09-10 142 1994 9.6
3 控方证人 42995 剧情/悬疑/犯罪 美国 1957-12-17 116 1957 9.5
4 霸王别姬 478523 剧情/爱情/同性 * 1993-01-01 171 1993 9.4
名字 投票人数 类型 产地 上映时间 时长 年代 评分
1 阿甘正传 580897 剧情/爱情 美国 1994-06-23 142 1994 9.4
2 肖申克的救赎 692795 剧情/犯罪 美国 1994-09-10 142 1994 9.6
3 控方证人 42995 剧情/悬疑/犯罪 美国 1957-12-17 116 1957 9.5
4 霸王别姬 478523 剧情/爱情/同性 * 1993-01-01 171 1993 9.4