pandas练习

案例名称:数组操作

案例描述:根据该二维列表 [[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文件中

现需求如下:

  1. 将a表、b表导入,以dataframe形式进行存储
  2. 将b表中的地区一列添加到a表中
  3. 补全a表星座一列数据,比如:天秤,改成天秤座,正常的数据不用修改
  4. 取出a表中出生日期在2010年7月之前的数据
  5. 计算不同星座的人数数量
  6. 计算不同血型不同星座的能量平均值
  7. 假设能量值在【100,400】之间称之为下忍,【401,600】之间称之为中忍,【601,800】之间称之为上忍,【801,1000】之间称之为火影,请在a表最后增加一列:忍者类型
  8. 计算每一年出生的人数
  9. 取出a表名称中含有宇智波的数据
  10. 找出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 x
2+y3
f2 = lambda x,y : x
2+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%3
0,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:x
3)

apply 作用于整个数组, 作用于 某一列, 某一行

map 作用于Series 一维数组, 作用于 某一列, 某一行

applymap 作用于整个数组

df.applymap(lambda x: x2)
df.d.applymap(lambda x:x
2)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值