案例名称:数组操作
案例描述:根据该二维列表 [[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]], 完成以下要求:
将该二维列表转换成numpy.ndarray对象,然后输出
请输出题1中数组对应的维度、元素个数、几行几列信息
将题1中得到的数组的第三行和第三列交叉位置的元素值改成0
依据经过题3修改后的数组,计算该数组行相加后的结果
依据经过题3修改后的数组,将该数组转换成一维数组,最后输出一维数组元素的和
import numpy as np
1. 将该二维列表转换成 numpy.ndarray 对象,然后输出
data = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]])
print(data)
2. 请输出题 1 中数组对应的维度、元素个数、几行几列信息
print(data.ndim)
print(data.size)
print(data.shape)
3. 将题 1 中得到的数组的第三行和第三列交叉位置的元素值改成 0
data[2,2]=0
data
4. 依据经过题 3 修改后的数组,计算该数组行相加后的结果
data.sum(axis=0)
依据经过题3修改后的数组,将该数组转换成一维数组,最后输出一维数组元素的和
one_array = data.flatten()
one_array.sum()
案例名称:数据预处理
案例描述:有如下数据:
data = {‘id’: [1,2,3,4,5,6,7,8],
‘name’: [‘张三’, ‘李四’, ‘王五’, ‘赵六’, ‘李琦’, ‘张芬’, ‘乔治’, ‘江杰’],
‘sex’: [‘男’, np.nan, ‘男’, ‘男’, ‘女’, ‘女’, ‘男’, ‘女’],
‘age’: [30,66,np.nan,37,28,102,63,35]}
现需求如下:
将题目中的data以dataframe形式进行存储,然后打印该dataframe
将age列含有空值的位置用age列平均值进行填充(在原dataframe上进行修改)
将含有空值的行删除(在原dataframe上进行修改)
增加一列:salary,salary值随机生成,范围在3000----5000中间
将该dataframe按照salary一列进行降序排列(在原数据上进行修改)
将该dataframe中性别一列进行修改,将男替换成1,女替换成0(在原数据上进行修改)
import pandas as pd
import numpy as np
import random
1.dataframe
data = {‘id’: [1,2,3,4,5,6,7,8],
‘name’: [‘张三’, ‘李四’, ‘王五’, ‘赵六’, ‘李琦’, ‘张芬’, ‘乔治’, ‘江杰’],
‘sex’: [‘男’, np.nan, ‘男’, ‘男’, ‘女’, ‘女’, ‘男’, ‘女’],
‘age’: [30,66,np.nan,37,28,102,63,35]}
data = pd.DataFrame(data)
data
2.将age列含有空值的位置用age列平均值进行填充(在原dataframe上进行修改)
data.age.fillna(value=int(data.age.mean()),inplace=True)
data
3. 将含有空值的行删除(在原dataframe上进行修改)
data.dropna(inplace=True)
data
增加一列:salary,salary值随机生成,范围在3000----5000中间¶
将该dataframe按照salary一列进行降序排列(在原数据上进行修改)
data[‘salary’] = [random.randint(3000,5000) for i in range (data.shape[0])]
data
data.sort_values(by=‘salary’,ascending=False,inplace=True)
data
将该dataframe中性别一列进行修改,将男替换成1,女替换成0(在原数据上进行修改)
data.sex.replace({‘女’:0,‘男’:1},inplace=True)
data
案例名称:用户画像
案例描述:导入《用户表》数据,进行如下操作:
将user_id一列从1开始递增,替换原有一列错误数据,在原数据上进行修改(原数据该列存在重复值)
将chanel_id一列不同渠道占比以饼状图形式进行呈现,并将渠道名称、渠道名称对应的占比情况(保留一位小数即可)也呈现在饼状图上
绘制柱状图,展现system中不同系统的数量情况,并且在每一个柱子上方标明系统数量值
根据age年龄一列,绘制年龄分布直方图
绘制柱状图,展现platform中不同平台的数量情况,并且在每一个柱子上方标明数量值
中国电信号段:[133,149,153,173,177,180,181,189,191,199];
中国联通号段:[130,131,132,145,155,156,166,171,175,176,185,186];
中国移动号段:[134,135,136,137,138,139,147,150,151,152,157,158,159,172,178,182,183,184,187,188,198];
以上是三大运营商的部分号段,现新增一列运营商类型一列,如果号段在中国电信号段中,则填写中国电信,依次类推,如果数据中存在号段在以上所给号段中均找不到的情况,则填写其他,最后根据运营商类型字段进行分组,绘制柱状图,展现三大运营商占有用户数量情况,并且在每一个柱子上方标明数量值;
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
字体引入 两种
1) 电脑自带
font windows c:/windows/fonts/xxxxx.ttc/xxxxxx/ttf
font mac fc-list :lang=zh 路径
2) anaconda自带字体库
设置字体格式
plt.rcParams[“font.family”] = [‘sans-serif’]
plt.rcParams[“font.sans-serif”] = ‘Arial Unicode MS’
data = pd.read_excel(‘./用户表.xlsx’)
data
1.将user_id一列从1开始递增,替换原有一列错误数据,在原数据上进行修改(原数据该列存在重复值)
data[‘user_id’] = [i+1 for i in range(data.shape[0])]
data
data[‘user_id’] = [i+1 for i in range(1000,data.shape[0]+1000)]
data
将chanel_id一列不同渠道占比以饼状图形式进行呈现,并将渠道名称、渠道名称对应的占比情况(保留一位小数即可)也呈现在饼状图上¶
data.chanel_id.value_counts().index
plt.figure(figsize=(10,6),dpi=100)
pathes,l_text,p_text = plt.pie(
data.chanel_id.value_counts(),
labels = data.chanel_id.value_counts().index,
labeldistance= 1.1,
autopct= “%1.1f%%”,
shadow=False,
startangle= 90,
pctdistance = 0.6
)
plt.show()
根据age年龄一列,绘制年龄分布直方图
plt.figure(figsize=(6,4),dpi=80)
plt.hist(data.age,bins=30)
plt.xticks(range(data.age.min(),data.age.max(),2))
plt.show()
绘制柱状图,展现system中不同系统的数量情况,并且在每一个柱子上方标明系统数量值
plt.figure(figsize=(6,4),dpi=80)
bar = plt.bar(x=data.platform.value_counts().index,height=data.platform.value_counts().values)
for i in bar:
print(i)
print(i.get_x())
print(i.get_y())
print(i.get_height())
print(i.get_width())
print(“-----”)
height = i.get_height()
plt.text(i.get_x()+i.get_width()/2,height+0.5,str(height),ha=‘center’)
plt.show()
### 中国电信号段:[133,149,153,173,177,180,181,189,191,199];
中国联通号段:[130,131,132,145,155,156,166,171,175,176,185,186];
中国移动号段:[134,135,136,137,138,139,147,150,151,152,157,158,159,172,178,182,183,184,187,188,198];
def phone_num(x):
if x in [133,149,153,173,177,180,181,189,191,199]:
return "中国电信 "
elif x in [130,131,132,145,155,156,166,171,175,176,185,186]:
return “中国联通”
elif x in [134,135,136,137,138,139,147,150,151,152,157,158,159,172,178,182,183,184,187,188,198]:
return “中国移动”
else:
return “其他”
第一步, 处理数据
data[‘type’] = data.phonenum.str[0:3].astype(‘int’).apply(phone_num)
data
2.绘图
plt.figure(figsize=(6,4), dpi=100)
bars = plt.bar(x=data.type.value_counts().index,height=data.type.value_counts().values)
for i in bars:
plt.text(i.get_x()+i.get_width()/2, i.get_height()+0.3, str(i.get_height()),ha=‘center’)
plt.show()
data.groupby(‘type’)[‘user_id’].count().plot.bar()
pandas 内置绘图方法
案例名称: 火影忍者分析
案例描述:
现有两个表格:将表格a、表格b以Excel形式进行存储,即:保存到Excel文件中
现需求如下:
- 将a表、b表导入,以dataframe形式进行存储
- 将b表中的地区一列添加到a表中
- 补全a表星座一列数据,比如:天秤,改成天秤座,正常的数据不用修改
- 取出a表中出生日期在2010年7月之前的数据
- 计算不同星座的人数数量
- 计算不同血型不同星座的能量平均值
- 假设能量值在【100,400】之间称之为下忍,【401,600】之间称之为中忍,【601,800】之间称之为上忍,【801,1000】之间称之为火影,请在a表最后增加一列:忍者类型
- 计算每一年出生的人数
- 取出a表名称中含有宇智波的数据
- 找出b表名称不在a表中的名称
读取数据
a = pd.read_excel(‘./火影a表.xlsx’)
b = pd.read_excel(‘./火影b表.xlsx’)
a
将b表中的地区一列添加到a表中
a = pd.merge(a,b,on=‘名称’,how=‘left’)
a
补全a表星座一列数据,比如:天秤,改成天秤座,正常的数据不用修改
def xingzuofun(y):
if len(y)!=3:
return y+“座”
else :
return y
a.星座 = a.星座.apply(xingzuofun)
a
a.星座.apply(lambda x: x+“座” if len(x)!=3 else x)
取出a表中出生日期在2010年7月之前的数据
a[a.出生日期<‘2010-07’]
计算不同星座的人数数量
a.星座.value_counts()
计算不同血型不同星座的能量平均值
a.groupby(by=[‘血型’,‘星座’]).mean()
假设能量值在【100,400】之间称之为下忍,【401,600】之间称之为中忍,【601,800】之间称之为上忍,【801,1000】之间称之为火影,请在a表最后增加一列:忍者类型
def judge(z):
if z >=100 and z<=400:
return ‘下忍’
elif z>=401 and z<=600:
return ‘中忍’
elif z>=601 and z<=800:
return ‘上忍’
else:
return ‘火影’
a[‘忍者类型’] = a.能量值.apply(judge)
a
计算每一年出生的人数
a.groupby(by=a.出生日期.dt.year)[‘名称’].count()
取出a表名称中含有宇智波的数据
def name(z):
if ‘宇智波’ in z:
return True
else:
return False
a[‘nametype’] = a.名称.apply(name)
a
a[a.名称.apply(lambda x: True if ‘宇智波’ in x else False )]
a[a.nametype==True]
找出b表名称不在a表中的名称
res = pd.merge(b,a,on=‘名称’,how=‘left’)
res
res[res.血型.isna()].名称
拓展
1.列表生成式
res = []
for i in range(7):
print(random.randint(3000,5000))
res.append(random.randint(3000,5000))
res
[1 for i in range(7)]
[1+i for i in range(7)]
[random.randint(3000,5000) for i in range(7)]
#[循环变化量 循环 ]
2.格式化输出
name = ‘zs’
age = 18
print(“%s的年龄是%d” %(name,age))
format
print(“姓名{}的年龄是{}”.format(name,age))
f
print(f"姓名叫{name},年龄是{age}")
3.三目运算符
x = 10
y = 2
res = ’ ’
if x>y:
res= “x大于y”
else :
res =“x小于y”
res
三目运算符
满足条件表达式的结果 if 条件表达式 else 不满足条件表达式的结果
result = “x大于y” if x>y else “x小于y”
result
4.lambda函数
def power(x):
return x**2
res = power(10)
res
lambda 参数 : 返回值
res1 = lambda x : x2
res1(10)
res1
print(type(res1))
def fun_sum(x,y):
return x2+y3
f2 = lambda x,y : x2+y**3
f2(10,5)
lambda 匿名函数
lambda 不能提高效率, 使得代码更加简单
lambda 不能用for in , for in 有 if
5.map函数
map 映射
map(function , 数据容器 )
def power(x):
return x**2
lista = [1,2,3,4]
resa = []
for i in lista:
jieguo = power(i)
resa.append(jieguo)
resa
resaother = list(map(power,lista))
resaother
list(map(lambda x:x**2,[1,2,3,4]))
listc = [11,12,13,14]
listd = [20,30,40,50]
newlist = []
for i in range(len(listc)):
newlist.append(listc[i]+listd[i])
newlist
def func(x,y):
return x+y
list(map(func,listc,listd))
list(map(lambda x,y : x+y, listc,listd))
6.filter 函数
listh = [i for i in range(100)]
listh
resh = []
for i in listh:
if i%3==0:
resh.append(i)
resh
filter 函数
作用: 过滤
filter(函数, 数据容器 )
def is_three(n):
return n%30
list(filter(is_three,listh))
list(filter(lambda n: n%30,listh))
7.map与apply
df = pd.DataFrame(np.random.randint(0,10,(4,4)),index=[1,2,3,4],columns=[‘a’,‘b’,‘c’,‘d’])
df
df.d.apply(lambda x: x+100)
df.apply(lambda x: x+200)
df.d.map(lambda x: x2)
df.map(lambda x:x3)
apply 作用于整个数组, 作用于 某一列, 某一行
map 作用于Series 一维数组, 作用于 某一列, 某一行
applymap 作用于整个数组
df.applymap(lambda x: x2)
df.d.applymap(lambda x:x2)