《利用python进行数据分析》读书笔记之数据转换(一)

删除重复值

由于种种原因,DataFrame中会出现重复行。考虑下列DataFrame:

import pandas as pd
data = pd.DataFrame({'k1':['one','two'] * 3 + ['two'],
                     'k2:':[1,1,2,3,3,4,4]})
# 0  one    1
# 1  two    1
# 2  one    2
# 3  two    3
# 4  one    3
# 5  two    4
# 6  two    4

DataFrame中的duplicated方法返回的是一个布尔值Series,这个Series反应的是每一行是否与之前出现过的行相同:

print(data.duplicated())
# 0    False
# 1    False
# 2    False
# 3    False
# 4    False
# 5    False
# 6     True
# dtype: bool

而drop_duplicates返回的是DataFrame,内容是非重复的部分(即duplicated方法返回的值为False的部分):

print(data.drop_duplicates())
#     k1  k2:
# 0  one    1
# 1  two    1
# 2  one    2
# 3  two    3
# 4  one    3
# 5  two    4

默认都是对列进行操作。可以指定数据的任何子集来检测是否有重复。现在我们为原来的DataFrame添加一列:

data['v1'] = range(7)
    k1  k2:  v1
# 0  one    1   0
# 1  two    1   1
# 2  one    2   2
# 3  two    3   3
# 4  one    3   4
# 5  two    4   5
# 6  two    4   6

可以基于某个特定的列来去除重复值:

print(data.drop_duplicates(['k1']))
#     k1  k2:  v1
# 0  one    1   0
# 1  two    1   1

默认保留的是第一个观测到的值。传入keep = 'last’将会返回最后一个。

使用函数或映射进行数据转换

我们可以对DataFrame中的数组、列或列中的数据进行转换。考虑下面的DataFrame:

import pandas as pd
data = pd.DataFrame({'food':['bacon','pulled porl','bacon',
                             'Pastrami','corned beef','Bacon',
                             'pastrami','honey ham','nova lox'],
                     'ounces':[4,3,12,6,7.5,8,3,5,6]})
#           food  ounces
# 0        bacon     4.0
# 1  pulled porl     3.0
# 2        bacon    12.0
# 3     Pastrami     6.0
# 4  corned beef     7.5
# 5        Bacon     8.0
# 6     pastrami     3.0
# 7    honey ham     5.0
# 8     nova lox     6.0

我先我们想将下列字典关联到上面的DataFrame中:

meat_to_animal = {
    'bacon' : 'pig',
    'pulled pork' : 'pig',
    "pastrami" : 'cow',
    "corned beef" : 'cow',
    "honey ham" : 'pig',
    'nova lox' : "salmin"
}

我们注意到上面的部分的食物名称为大写
我们可以使用以下方式进行关联:

new_columns = data['food'].map(lambda x:meat_to_animal[x.lower()])
#这里Series的lower方法是将大写字母变为小写字母,并以Series的形式返回
# 0       pig
# 1       pig
# 2       pig
# 3       cow
# 4       cow
# 5       pig
# 6       cow
# 7       pig
# 8    salmin
# Name: food, dtype: object
data['animal'] = new_columns
#           food  ounces  animal
# 0        bacon     4.0     pig
# 1  pulled pork     3.0     pig
# 2        bacon    12.0     pig
# 3     Pastrami     6.0     cow
# 4  corned beef     7.5     cow
# 5        Bacon     8.0     pig
# 6     pastrami     3.0     cow
# 7    honey ham     5.0     pig
# 8     nova lox     6.0  salmon

替代值

考虑下面的Series:

data = pd.Series([1.,999.,2.,-999.,-1000.,3.])
# 0       1.0
# 1     999.0
# 2       2.0
# 3    -999.0
# 4   -1000.0
# 5       3.0
# dtype: float64

我们可能想要将某些值替换为其他值,比如将-999.替换为NA:

data.replace(-999.,np.nan)
# 0       1.0
# 1     999.0
# 2       2.0
# 3       NaN
# 4   -1000.0
# 5       3.0
# dtype: float64

我们也可以将多个值替换为某个值:

data.replace([-999,-1000.],np.nan
# 0      1.0
# 1    999.0
# 2      2.0
# 3      NaN
# 4      NaN
# 5      3.0
# dtype: float64

我们也可以将多个值替换为不同的值:

data.replace([-999,-1000.],[np.nan,0])
# 0      1.0
# 1    999.0
# 2      2.0
# 3      NaN
# 4      0.0
# 5      3.0
# dtype: float64

重命名轴索引

我们可以在不生成新的数据结构的情况下修改轴,考虑下面的这个数据结构:

import pandas as pd
import numpy as np

data = pd.DataFrame(np.arange(12).reshape((3,4)),
                    index = ['Ohio','Colorado','New York'],
                    columns = ['one','two','three','four'])
#           one  two  three  four
# Ohio        0    1      2     3
# Colorado    4    5      6     7
# New York    8    9     10    11

与Series类似,轴索引也有一个map方法:

transform_func = lambda x: x[:4].upper()
data.index = data.index = data.index.map(transform_func)
#       one  two  three  four
# OHIO    0    1      2     3
# COLO    4    5      6     7
# NEW     8    9     10    11

如果我们想要另外创建一个修改后的版本,并且不改变原来的数据集,那么我们可以使用rename方法:

data.rename(index = str.upper,columns = str.title)
#           One  Two  Three  Four
# OHIO        0    1      2     3
# COLORADO    4    5      6     7
# NEW YORK    8    9     10    11

如果我们想要修改原数据集可以传入参数‘inplace = True’。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值