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
方法可以 接受一个函数或含有映射关系的字典型对象,但是如果碰到一些映射的对象中有些值的首字母大写了,而有些则没有,就需要使用 Series
的 str.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属性中有年龄数据的标签。
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
的函数,可以根据 样本分位数对数据进行面元划分,得到 大小基本相等的面元。
cut
和 qcut
函数均是离散化函数,对 分位和 分组分析非常重要。
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)转换为” 哑变量“或” 指标矩阵“。
>如果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_dummies
的 prefix参数可以实现在指标DataFrame的列加上一个前缀,便于跟其他数据合并。
dummies=pd.get_dummies(df['key'],prefix='key')
df_with_dummy=df[['data1']].join(dummies)
Original: https://blog.csdn.net/Mrrunsen/article/details/116525862
Author: Mrrunsen
Title: 【Python系列专栏】第六十五篇 Python中 Pandas 数据转换
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/742049/
转载文章受原作者版权保护。转载请注明原作者出处!