【Python系列专栏】第六十五篇 Python中 Pandas 数据转换

7.2 数据转换

Pandas 另一类重要操作是过滤、清理以及其他的转换工作。

7.2.1 移除重复数据

​ DataFrame的duplicated方法返回一个布尔型Series,表示各行是否是重复行(前面出现过的行)。还有一个与此相关的drop_duplicates方法,它会返回一个DataFrame,重复的数组会标为False。【这两种方法默认会判断全部列,也可以指定部分列进行重复项判断。例如,只希望根据某一列过滤重复项,只需要传参到上面的方法中。】

duplicated和drop_duplicates默认保留的是第一个出现的值组合。传入keep=‘last’则保留最后一个。


7.2.2 利用函数或映射进行数据转换

​ 希望根据数组、Series或DataFrame列中的值来实现转换工作。

​ Series的map方法可以接受一个函数或含有映射关系的字典型对象,但是如果碰到一些映射的对象中有些值的首字母大写了,而有些则没有,就需要使用Seriesstr.lower方法,将各个值转换为小写。

​ 例如:

lowercased=data['food'].str.lower()

data['animal']=lowercased.map(meat_to_animal)

​ 使用map是一种实现元素级转换以及其他数据清理工作的便捷方式。


7.2.3 替换值

使用fillna方法填充缺失数据可以看做值替换的一种特殊情况。

replace产生一个新的Series(除非传入inplace=True)

data=pd.Series([1,-999,2.,-999,-1000,3.])
data.replace(-999,np.nan)
data.replace([-999,-1000],np.nan)  #一次替换多个值,可以传入一个由待替换值组成的列表以及一个替换值
data.replace([-999,-1000],[np.nan,0])  #让每个值有不同的替换值,传递一个替换列表

#传入的参数也可以是字典
data.replace({-999:np.nan,-1000:0})

注意data.replace方法与data.str.replace不同,后者做的是字符串的元素级替换。


7.2.4 重命名轴索引

​ 将重命名的值赋给index,可以对DataFrame进行就地修改:

data.index=data.index.map(transform)

​ 如果想要创建数据集的转换版(不是修改原始数据),采用rename方法:rename可以集合字典型对象实现对部分轴标签的更新。

data.rename(index=str.title,columns=str.upper)

​ rename可以实现复制DataFrame并对其索引和列标签进行赋值。如果希望就地修改某个数据集,传入inplace=True即可:

data.name(index={'ohho':'OHHO'},inplace=True)

7.2.5 离散化和面元划分

​ 为了便于分析,连续数据常常被离散化或拆分为“面元”。

​ 比如希望划分不同的年龄组:

import numpy as np
import pandas as pd
from numpy import nan as NA

ages=[20,22,25,27,21,23,37,31,61,45,41,32]

​ 将上面这些数据划分为不同的年龄段,如18~ 25,26~35…

​ 需要使用pandas的cut函数:

bins=[18,25,35,60,100]  #划分的年龄段
cats=pd.cut(ages,bins) #cut函数的第一个参数是连续数据,第二个参数是划分依据

​ 输出结果:

[(18, 25], (18, 25], (18, 25], (25, 35], (18, 25], ..., (25, 35], (60, 100], (35, 60], (35, 60], (25, 35]]
Length: 12
Categories (4, interval[int64]): [(18, 25] < (25, 35] < (35, 60] < (60, 100]]
#上面的区间括号的开闭可以通过类似于right=False的方式进行修改,只需要在cut函数中传入这一参数

​ 返回的是一个特殊的Categories对象,结果展示了pandas.cut划分的面元。codes属性中有年龄数据的标签。

pd.value_counts(cats)是pandas.cut结果的面元计数

pd.value_counts(cats)

#输出结果
(18, 25]     5
(35, 60]     3
(25, 35]     3
(60, 100]    1
dtype: int64

修改面元名称

​ 传递一个列表或数组到labels

​ 例如,labels=group_names;

​ 如果向cut传入的是面元的数量而不是确切的面元边界,则会根据数据的最小值和最大值计算等长面元

pd.cut(data,4,precision=2)
#4-面元数量
#precision=2-限定小数只有两位

qcut是类似于cut的函数,可以根据样本分位数对数据进行面元划分,得到大小基本相等的面元

cutqcut函数均是离散化函数,对分位分组分析非常重要。


7.2.6 检测和过滤异常值

​ 过滤或变换异常值(outlier)实质是数组运算


7.2.7 排列和随机采样

​ 利用numpy.random.permutation函数可以实现Series或DataFrame的列的排列工作(permuting,随机重排序)。通过需要排列的轴的长度调用permutation,产生一个表示新顺序的整数数组。

df=pd.DataFrame(np.arange(5*4),reshape((5,4)))
sampler=np.random.permutation(5)  #新顺序的整数数组

#基于iloc的索引操作或take函数中使用该数组
df.take(sampler)

sample方法:可以不用替换的方式选取随机子集。


7.2.8 计算指标/哑变量

​ 用于统计建模或机器学习的转换方式是:将分类变量(categorical variable)转换为“哑变量”或“指标矩阵”。

	>如果DataFrame的某一列中含有k个不同的值,则可以派生出一个k列矩阵或DataFrame(其值全为1和0)。
	>
	>pandas的`get_dummies`函数可以实现。
df=pd.DataFrame({'key':['b','b','a','c','a','b'],
				'datal':range(6)})
pd.get_dummies(df['key'])

在这里插入图片描述

​ 原数据中有3个不同的值,转换后就派生出3列,其值为0或1;

get_dummiesprefix参数可以实现在指标DataFrame的列加上一个前缀,便于跟其他数据合并。

dummies=pd.get_dummies(df['key'],prefix='key')

在这里插入图片描述

df_with_dummy=df[['data1']].join(dummies)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mrrunsen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值