数据分析 五 pandas数据处理 删除重复行 映射

1、删除重复元素

 

使用duplicated()函数检测重复的行,返回元素为布尔类型的Series对象,每个元素对应一行,如果该行不是第一次出现,则元素为True

 
- keep参数:指定保留哪一重复的行数据
 
  • 创建具有重复元素行的DataFrame
import pandas as pd
from pandas import Series,DataFrame
import numpy as np

df = DataFrame(data=np.random.randint(0,100,size=(10,6)))

#手动将df的某几行设置成相同的内容
df.iloc[1] = [1,1,1,1,1,1]
df.iloc[3] = [1,1,1,1,1,1]
df.iloc[7] = [1,1,1,1,1,1]


=============
    0    1    2    3    4    5
0    90    79    67    38    58    59
1    1    1    1    1    1    1
2    75    50    67    72    30    28
3    1    1    1    1    1    1
4    16    95    19    9    29    73
5    4    8    17    75    34    31
6    82    75    57    82    15    3
7    1    1    1    1    1    1
8    85    52    94    54    99    42
9    53    20    49    15    87    93

使用drop_duplicates()函数删除重复的行

  • drop_duplicates(keep='first/last'/False)
df.drop_duplicates(keep='first')
===============

0    1    2    3    4    5
0    90    79    67    38    58    59
1    1    1    1    1    1    1
2    75    50    67    72    30    28
4    16    95    19    9    29    73
5    4    8    17    75    34    31
6    82    75    57    82    15    3
8    85    52    94    54    99    42
9    53    20    49    15    87    93

 

2. 映射

 

1) replace()函数:替换元素

 

使用replace()函数,对values进行映射操作

 

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,10,size=(6,5)))

df.replace(to_replace=4,value='four')  #把df中所有4替换成four

df.replace(to_replace=1,value='one')  # 同理但是不会影响原df
 

 

指定列

df.replace(to_replace={3:2},value='two')   # 3这一列的2替换成two

2) map()函数:新建一列 , map函数并不是df的方法,而是series的方法

 
  • map()可以映射新一列数据

  • map()中可以使用lambd表达式

  • map()中可以使用方法,可以是自定义的方法

    eg:map({to_replace:value})

  • 注意 map()中不能使用sum之类的函数,for循环

 
  • 新增一列:给df中,添加一列,该列的值为中文名对应的英文名
dic = {
    'name':['周杰伦','张三','周杰伦'],
    'salary':[20000,12000,20000]
}
df = DataFrame(data=dic)

#映射关系表
dic = {
    '周杰伦':'jay',
    '张三':'tom'
}
df['e_name'] = df['name'].map(dic)
    name    salary    e_name
0    周杰伦    20000    jay
1    张三    12000    tom
2    周杰伦    20000    jay

 

map当做一种运算工具,至于执行何种运算,是由map函数的参数决定的(参数:lambda,函数)

  • 使用自定义函数
def after_sal(s):
    return s - (s-3000)*0.5

#超过3000部分的钱缴纳50%的税
df['after_sal'] = df['salary'].map(after_sal)
name    salary    e_name    after_sal
0    周杰伦    20000    jay    11500.0
1    张三    12000    tom    7500.0
2    周杰伦    20000    jay    11500.0

 

 apply和map都可以作为一种基于Series的运算工具,并且apply比map更快
df['salary'].apply(after_sal)

注意:并不是任何形式的函数都可以作为map的参数。只有当一个函数具有一个参数且有返回值,那么该函数才可以作为map的参数。

 

3. 使用聚合操作对数据异常值检测和过滤

 

使用df.std()函数可以求得DataFrame对象每一列的标准差

 
  • 创建一个1000行3列的df 范围(0-1),求其每一列的标准差
df = DataFrame(data=np.random.random(size=(1000,3)),columns=['A','B','C'])

  

  对df应用筛选条件,去除标准差太大的数据:假设过滤条件为 C列数据大于两倍的C列标准差

std_twice = df['C'].std() * 2
df['C'] > std_twice
df.loc[df['C'] > std_twice]
indexs = df.loc[df['C'] > std_twice].index
df.drop(labels=indexs,axis=0,inplace=True)

数据清洗

  • 清洗空值
    • df.dropna()
    • df.fillna()
  • 清洗重复值
    • df.drop_duplicates()
  • 清洗异常值
    • 异常值判定的条件
    • 异常值对应的行数据进行删除

4. 排序

 

使用.take()函数排序

- take()函数接受一个索引列表,用数字表示,使得df根据列表中索引的顺序进行排序
- eg:df.take([1,3,4,2,5])

可以借助np.random.permutation()函数随机排序

    np.random.permutation(x)可以生成x个从0-(x-1)的随机数列

np.random.permutation(3)

=====
array([2, 0, 1])
# 先对行进行排序,再对列惊醒排序 
df.take(np.random.permutation(3),axis=1).take(np.random.permutation(1000),axis=0)[0:10]

随机抽样

 

当DataFrame规模足够大时,直接使用np.random.permutation(x)函数,就配合take()函数实现随机抽样

 

 

5. 数据分类处理【重点】

 

数据聚合是数据处理的最后一步,通常是要使每一个数组生成一个单一的数值。

数据分类处理:

  • 分组:先把数据分为几组
  • 用函数处理:为不同组的数据应用不同的函数以转换数据
  • 合并:把不同组得到的结果合并起来

数据分类处理的核心:

 - groupby()函数
 - groups属性查看分组情况
 - eg: df.groupby(by='item').groups
 

分组

from pandas import DataFrame,Series
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]})

=======
color    item    price    weight
0    red    Apple    4.0    12
1    yellow    Banana    3.0    20
2    yellow    Orange    3.0    50
3    green    Banana    2.5    30
4    green    Orange    4.0    20
5    green    Apple    2.0    44

 

使用groupby实现分组

df.groupby(by='item',axis=0)


======
<pandas.core.groupby.DataFrameGroupBy object at 0x0000022047A91160>

使用groups查看分组情况

#该函数可以进行数据的分组,但是不显示分组情况
df.groupby(by='item',axis=0).groups


==========
{'Apple': Int64Index([0, 5], dtype='int64'),
 'Banana': Int64Index([1, 3], dtype='int64'),
 'Orange': Int64Index([2, 4], dtype='int64')}

分组后的聚合操作:分组后的成员中可以被进行运算的值会进行运算,不能被运算的值不进行运算

#给df创建一个新列,内容为各个水果的平均价格
df.groupby(by='item',axis=0).mean()['price']

==============
item
Apple     3.00
Banana    2.75
Orange    3.50
Name: price, dtype: float64
s = df.groupby(by='item',axis=0)['price'].mean()
s.to_dict()

===============
{'Apple': 3.0, 'Banana': 2.75, 'Orange': 3.5}

 

 

df['item'].map(s.to_dict())

df['mean_price'] = df['item'].map(s.to_dict())

===============

color    item    price    weight    mean_price
0    red    Apple    4.0    12    3.00
1    yellow    Banana    3.0    20    2.75
2    yellow    Orange    3.0    50    3.50
3    green    Banana    2.5    30    2.75
4    green    Orange    4.0    20    3.50
5    green    Apple    2.0    44    3.00

 

按颜色查看各种颜色的水果的平均价格

s = df.groupby(by='color',axis=0)['price'].mean()
dic = s.to_dict()
==============
    color    item    price    weight    mean_price    color_mean_price
0    red    Apple    4.0    12    3.00    4.000000
1    yellow    Banana    3.0    20    2.75    3.000000
2    yellow    Orange    3.0    50    3.50    3.000000
3    green    Banana    2.5    30    2.75    2.833333
4    green    Orange    4.0    20    3.50    2.833333
5    green    Apple    2.0    44    3.00    2.833333

6.0 高级数据聚合

 

使用groupby分组后,也可以使用transform和apply(运算工具)提供自定义函数实现更多的运算

  • df.groupby('item')['price'].sum() <==> df.groupby('item')['price'].apply(sum)
  • transform和apply都会进行运算,在transform或者apply中传入函数即可
  • transform和apply也可以传入一个lambda表达式
def myMean(s):#必须要有一个参数
    sum = 0
    for i in s:
        sum += i
    return sum/len(s)

df.groupby(by='item')['price'].apply(myMean)#apply返回值是没有经过映射的

================
item
Apple     3.00
Banana    2.75
Orange    3.50
Name: price, dtype: float64
 
df.groupby(by='item')['price'].transform(myMean) #transform返回值是经过映射的

=================
0    3.00
1    2.75
2    3.50
3    2.75
4    3.50
5    3.00
Name: price, dtype: float64
 

 

posted @ 2021-01-02 17:20  蜗牛般庄  阅读(2173)  评论(0编辑  收藏  举报
Title
页脚 HTML 代码