【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)

​ 输出结果:

[(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]]

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

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

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)

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)

df.take(sampler)

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

7.2.8 计算指标/哑变量

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

    >&#x5982;&#x679C;DataFrame&#x7684;&#x67D0;&#x4E00;&#x5217;&#x4E2D;&#x542B;&#x6709;k&#x4E2A;&#x4E0D;&#x540C;&#x7684;&#x503C;&#xFF0C;&#x5219;&#x53EF;&#x4EE5;&#x6D3E;&#x751F;&#x51FA;&#x4E00;&#x4E2A;k&#x5217;&#x77E9;&#x9635;&#x6216;DataFrame&#xFF08;&#x5176;&#x503C;&#x5168;&#x4E3A;1&#x548C;0&#xFF09;&#x3002;
    >
    >pandas&#x7684;get_dummies&#x51FD;&#x6570;&#x53EF;&#x4EE5;&#x5B9E;&#x73B0;&#x3002;
df=pd.DataFrame({'key':['b','b','a','c','a','b'],
                'datal':range(6)})
pd.get_dummies(df['key'])

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

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

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

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

【Python系列专栏】第六十五篇 Python中 Pandas 数据转换
df_with_dummy=df[['data1']].join(dummies)

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

Original: https://blog.csdn.net/Mrrunsen/article/details/116525862
Author: Mrrunsen
Title: 【Python系列专栏】第六十五篇 Python中 Pandas 数据转换

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/742049/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球