Pandas高级操作

文章目录

引入包

import numpy as np
import pandas as pd
from pandas import DataFrame

一、替换操作

  • 替换操作可以同步作用于Series和DataFrame中
    单值替换
    普通替换:替换所有符合要求的原色:to_replace = 15, value =‘e’
    按列指定单值替换: to_replace ={列标签: 替换值}value =‘value’
    多值替换
  • 列表替换:to_replace =[] value = []
  • 字典替换(推荐)⭐ to_replace = {to_replace:value, to_replace:value}
df = DataFrame(data = np.random.randint(0,100,size=(5,6)))
df

Pandas高级操作

  • 单值替换

将数据中8替换成eight

df.replace(to_replace=8,value='eight')

Pandas高级操作

  • 多值替换

使用字典复制给to_replace

df.replace(to_replace={0:'zero',1:'one'})

Pandas高级操作

  • 指定列的替换
    Pandas高级操作

替换第2列中的31为指定内容

df.replace(to_replace={2:31},value=333111)

Pandas高级操作

若没有指定列

df.replace(to_replace=31,value=333111)

Pandas高级操作


二、映射操作⭐

  • 概念: 创建一个映射关系表,把values元素和一个特定的标签或者字符串绑定(给以元素值提供不同的表现形式)
  • 创建一个df,两列分别是姓名和薪资,然后给其名字起对应的英文名
dic = {
    'name':['张三','李四','张三'],
    'salary':[15000,20000,15000]
}
df = DataFrame(data = dic)
df

Pandas高级操作

map只是Series的方法,只能被Series调用

#映射关系表:制定了映射的对照关系
dic = {
    '张三':'tom',
    '李四':'jerry'
}

df['e_name'] = df['name'].map(dic)
df

Pandas高级操作

小案例-计算税后薪资

  • 超过3000部分的钱缴纳50%的税,计算每个人的税后薪资
def after_sal(s):
    return s - (s-3000)*0.5

df['after_sal'] = df['salary'].map(after_sal)
df

Pandas高级操作

DataFrame 中apply操作

  • apply :将函数作用到行或者列
  • applymap :将某种元素作用到每一个元素
df = DataFrame(data = np.random.randint(0,10,size=(5,3)))
df

Pandas高级操作

  • apply
  • 与axis参数一起使用
  • df中有几行/几列 func函数就会执行几次
def my_add(value):
    return value+10

df.apply(my_add,axis=0) 

Pandas高级操作

df

Pandas高级操作

查看apply的详细运行过程

def my_add(value):
    print(value)


df.apply(my_add,axis=1)

Pandas高级操作

  • applymap

作用到每一个元素当中:有几个元素就调用几次

df

Pandas高级操作

def my_add(value):
    print(value)

df.applymap(my_add) 

Pandas高级操作

df.applymap(my_add)

Pandas高级操作

  • transform

该用例来自:transform函数(来自Python Pandas)的初步应用
考虑这样一个例子,我们有来自某商店的表格如下:

Pandas高级操作

而我们希望生成一个新列,统计每个用户的平均购买额,如下:

Pandas高级操作

df["User_Mean"] = df.groupby('User_ID')["Purchase"].transform('mean')

想了解更多,参考以下文章:

  1. 掌握pandas中的transform
  2. 理解Pandas的Transform

三、排序实现随机抽样

take():

  • 1:列 0:行
  • np.random.permutation()
df = DataFrame(data=np.random.randint(0,100,size=(100,3)),columns=['A','B',"C"])
df

Pandas高级操作

# 返回0-10的随机序列
np.random.permutation(10)

array([3, 2, 8, 4, 5, 6, 9, 1, 0, 7])

# 1. 将原始数据打乱  -- 但是行列索引不能乱
# indices只能作用于隐式索引 ⭐
# 1 :列   0 :行
df.take(indices=[1,0,2],axis=1)

Pandas高级操作

df.take(indices=np.random.permutation(3),axis=1) # 打乱的列

Pandas高级操作

# 打乱列,打乱行 连续调用两次take
random_df = df.take(indices=np.random.permutation(3),axis=1).take(indices=np.random.permutation(100),axis=0)
random_df

Pandas高级操作

# 随机抽样 
random_df[0:10]

Pandas高级操作


四、数据的分裂处理

数据分类处理的核心:

  • groupby()函数
  • groups属性查看分组情况
df = DataFrame({'item':['Apple','Banana','Orange','Banana','Orange','Apple'],
                'price':[4,3,3,2.5,4,2],
               'color':['red','yellow','yellow','green','green','green'],
               'weight':[12,20,50,30,20,44]})
df

Pandas高级操作

  • 根据水果的种类分析
df.groupby(by='item')

<pandas.core.groupby.generic.DataFrameGroupBy object at 0x0000016AC4932AC8>

# 查看分组结果
df.groupby(by='item').groups

{‘Apple’: [0, 5], ‘Banana’: [1, 3], ‘Orange’: [2, 4]}

  • 计算每种水果的价格
  • 方法一(不推荐)
df.groupby(by='item').mean() # 只能对数值型数据进行聚合

Pandas高级操作

df.groupby(by='item').mean()['price']

item
Apple 3.00
Banana 2.75
Orange 3.50
Name: price, dtype: float64

  • 方法二:推荐⭐
df.groupby(by='item')['price']# 将分好组的数据中的价格数据单独取出来

<pandas.core.groupby.generic.SeriesGroupBy object at 0x0000024FABA5B860>

df.groupby(by='item')['price'].mean()

item
Apple 3.00
Banana 2.75
Orange 3.50
Name: price, dtype: float64

  • 将每种数据的平均价格汇总到源数据中
# 1. 弄出映射的字典
mean_price = df.groupby(by='item')['price'].mean()
dic = mean_price.to_dict()
dic

{‘Apple’: 3.0, ‘Banana’: 2.75, ‘Orange’: 3.5}

# 2. 使用映射字典
df['mean_price'] = df['item'].map(dic)
df

Pandas高级操作

  • 求出每一种颜色对应的水果的平均重量,且将求出的数据添加到源数据中
mean_color_weight = df.groupby(by='color')['weight'].mean()
dic = mean_color_weight.to_dict()
df['color_mean_weight'] = df['color'].map(dic)
df

Pandas高级操作


五、高级数据聚合

  • 使用groupby分组后,也可以使用transform和apply提供自定义函数实现更多的运算
  • df.groupby(‘item’)[‘price’].sum() <==> df.groupby(‘item’)[‘price’].apply(sum)
  • transform和apply都会进行运算,在transform或者apply中传入函数即可
  • transform和apply也可以传入一个lambda表达式
  • 将每一种颜色的价格提升15个点,将提升的价格添加到源数据中
df

Pandas高级操作
Pandas高级操作

def addPrice(p):
    return p*1.15

# apply分组中的运算工具
df.groupby('item')['price'].transform(addPrice)

Pandas高级操作

def addPrice(p):
    return p*1.15

# apply分组中的运算工具
df['price'] = df.groupby('item')['price'].apply(addPrice)
df

Pandas高级操作

数据加载

读取type-.txt文件数据
将文件中每一个词作为元素存放在DataFrame中

Pandas高级操作

  • 读取数据
data = pd.read_csv('./data/type-.txt')
data

Pandas高级操作

data.shape

(2, 1)

换种方式读取,加入分隔符

data = pd.read_csv('./data/type-.txt',sep='-')
data

Pandas高级操作

data.shape

(2, 3)

换种方式读取数据,让头部使用隐式索引

data = pd.read_csv('./data/type-.txt',sep='-',header=None)
data

Pandas高级操作

data.shape

(3, 3)

换种方式读取数据,让头部使用显式索引

data = pd.read_csv('./data/type-.txt',sep='-',header=None,names=['A','B','C'])
data

33Pandas高级操作

读取数据库数据

  1. Pandas高级操作
  2. Pandas高级操作

六、透视表

透视表是一种可以对数据动态排布并且分类汇总的表格格式。或许大多数人都在Excel使用过数据透视表,也体会到它的强大功能,而在pandas中它被称作pivot_table
透视表的优点:

  • 灵活性高,可以随意定制你的分析计算要求
  • 脉络清晰易于理解数据
  • 操作性强,报表神器
df = pd.read_csv('./data/透视表-篮球赛.csv')
df

Pandas高级操作

pivot_table有四个最重要的参数:indexvaluescolumnsaggfunc:

  • index参数:分类汇总的分类条件
    • 每个pivot_table必须拥有一个index。如果想查看哈登对阵每个队伍的得分则需要对每一个队进行分类并计算其各类得分的平均值
  • values参数:需要对计算的数据进行筛选
  • Aggfunc参数:设置我们对数据聚合时进行的函数操作
    • 当我们未设置aggfunc时,它默认aggfunc='mean’计算均值。
  • Columns:可以设置列层次字段
  • 想看看哈登对阵同一对手在不同主客场下的数据,分类条件为对手和主客场
df.pivot_table(index=['对手','主客场'])

Pandas高级操作

  • 如果我们只需要哈登在主客场和不同胜负情况下的得分、篮板与助攻三项数据
df.pivot_table(index=['主客场','胜负'],values=['得分','篮板','助攻'])

Pandas高级操作

  • 还想获得james harden在主客场和不同胜负情况下的总得分、总篮板、总助攻时
df.pivot_table(index=['主客场','胜负'],values=['得分','篮板','助攻'],aggfunc='sum')

Pandas高级操作

通过字典的方式对数据进行不同的运算

df.pivot_table(index=['主客场','胜负'],values=['得分','篮板','助攻'],aggfunc={'得分':'sum','篮板':'mean','助攻':'std'})

Pandas高级操作

  • 对values字段进行分类,获取所有队主客场的总得分
df.pivot_table(index='主客场',values='得分',aggfunc='sum')

Pandas高级操作

查看主客场下的总得分的组成元素是谁

df.pivot_table(index='主客场',values='得分',aggfunc='sum',columns='对手',fill_value=0)

Pandas高级操作


七、交叉表

  • 是一种用于计算分组的特殊透视图,对数据进行汇总
  • pd.crosstab(index,colums)
    • index:分组数据,交叉表的行索引
    • columns:交叉表的列索引
import pandas as pd
from pandas import DataFrame

df = DataFrame({'sex':['man','man','women','women','man','women','man','women','women'],
               'age':[15,23,25,17,35,57,24,31,22],
               'smoke':[True,False,False,True,True,False,False,True,False],
               'height':[168,179,181,166,173,178,188,190,160]})
df

Pandas高级操作

  • 求出各个性别抽烟的人数
pd.crosstab(index=df.smoke,columns=df.sex)

Pandas高级操作

pd.crosstab(index=df.sex,columns=df.smoke)

Pandas高级操作

  • 求出各个年龄段抽烟人情况
pd.crosstab(df.age,df.smoke)

Pandas高级操作


上一篇:Java描述 LeetCode,123. Best Time to Buy and Sell Stock III(买卖股票的时机III)


下一篇:javaday01