[455]pandas.DataFrame基本操作及缺失值处理
查看DataFrame数据及属性
import pandas as pd
df_obj = pd.DataFrame() #创建DataFrame对象
df_obj.dtypes #查看各⾏的数据格式
df_obj['列名'].astype(int)#转换某列的数据类型
df_obj.head() #查看前⼏⾏的数据,默认前5⾏
df_obj.tail() #查看后⼏⾏的数据,默认后5⾏
df_obj.index #查看索引
lumns #查看列名
df_obj.values #查看数据值
df_obj.describe() #描述性统计
df_obj.T #转置
df_obj.sort_values(by=['',''])#同上
为DataFrame添加新的属性列
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randint(0, 10, (2, 4)), columns=list('ABCD'))
df['total'] = df['A'] + df['B'] + df['C'] + df['D']
# 等价于 df['total'] = df.A + df.B + df.C + df.D
数据类型
df.values⇒ 返回的是 numpy 下的多维数组;
df.dtypes:返回的是各个属性列的类型;
df.select_dtypes([np.object]),df.select_dypes([bool])
简单数据统计
统计某⼀属性可能的取值:df.column_name.unique()
统计出现的次数:df.column_name.value_counts()
column_name 对应的是该 DataFrame 中某列的列名;也即 pandas 下的 DataFrame 对象直接⽀持 点+列名的⽅式进⾏索引;
缺失值的处理
所有缺失值字段填充为 0:df.fillna(0),⼀定要⼗分注意的⼀点是,df.fillna() 操作默认(inplace=False)不是 inplace,也即不是对原始 data frame 直接操作修改的,⽽是创建⼀个副本,对副本进⾏修改;
df.fillna(0, inplace=True)
df = df.fillna(0)
舍弃那些全⾏为 NaN 的⾏,以及全列为 NaN 的⾏:
df.dropna(axis=[0, 1], how=’all’)
删除某些⾏和列:
df.drop([], axis=1, inplace=True) ⇒ axis = 1,删除列;
df.drop([], axis=0, inplace=True) ⇒ axis = 0,删除⾏;
⾸先创建具有缺失值NaN(Not A Number)的CSV(comma-separated values)⽂件:
import pandas as pd
from io import StringIO
csv_data = '''A,B,C,D
1.0,
2.0,
3.0,
4.0
5.0,
6.0,,8.0
0.0,11.0,12.0,'''
df = pd.read_csv(StringIO(csv_data))
删除含缺失值的样本
具体处理⽅法:
df.isnull()#是缺失值返回True,否则范围False
df.isnull().sum()#返回每列包含的缺失值的个数
df.dropna()#直接删除含有缺失值的⾏
df.dropna(axis = 1)#直接删除含有缺失值的列
df.dropna(how = ‘all’)#只删除全是缺失值的⾏
df.dropna(thresh = 4)#保留⾄少有4个缺失值的⾏
df.dropna(subset = [‘C’])#删除含有缺失值的特定的列
填充缺失值
数值型数值(Numerical Data)
⽅法⼀:fillna()函数
df.fillna(0):⽤0填充
df.fillna(method=‘pad’):⽤前⼀个数值填充
df.an()):⽤该列均值填充
均值填充
age_mean = an()
# age_mean = data['Age'].mean()
data.Age[data['Age'].isnull()] = age_mean
# data['Age'] == data.Age ⼆者是等效的
⽅法⼆:Imputer
from sklearn.preprocessing import Imputer
imr = Imputer(missing_values='NaN', strategy='mean', axis=0)#均值填充缺失值
imr = imr.fit(df)
imputed_data = ansform(df.values)
DataFrame的基本操作,增、减、改、查
⼀. 数据选取
从已有的DataFrame中取出其中⼀列或⼏列,并对其进⾏操作。
Pandas取出DataFrame的列有两种⽅式,两个⽅式没有好与坏之分,还是看个⼈喜欢⽤哪个
#-*- coding:utf-8 -*-
import pandas as pd
df = pd.DataFrame({'goods':['coke cola', 'eggplant','condom'], 'quantity':[12,3,1], 'price':[20,12,80]})
df['goods']    #选择df的goods这⼀列
需要注意的是,第⼀种⽅法看似像是⼀种列表形式,但是如果像是如下⽅式书写代码会报错
df['goods','quantity']    #会报错,不要妄想通过这种⽅式获取多列。
上⽅的形式会引发⼀个KeyError的错误。如果想通过第⼀种形式获取多列,正确的形式如下
df[['goods','quantity']]
将多列的列名按照⼀个list的形式传⼊,就可以获取⼀个DataFrame的多列。
⼆. 数据筛选
往往选取出⼏个DataFrame的列并不能满⾜筛选,DataFrame的筛选的形式⽐较特殊,对列进⾏筛选时⽤到的是之前所讲的第⼆种选取列的形式,有点像是把列名视为⼀个DataFrame的属性。
#-*- coding:utf-8 -*-
import pandas as pd
df = pd.DataFrame({'goods':['coke cola', 'eggplant','condom'], 'quantity':[12,3,1], 'price':[20,12,80]})
print ds =='eggplant']
#      goods  price  quantity
# 1  eggplant    12        3
上⾯代码的意思是选取DataFrame中,goods列的值为’eggplant‘的所有⾏。DataFrame中也⽀持多条件筛选,与Python的判断语句相同,and、or、not 和 xor分别代表 和、或、⾮、抑或。也可以⽤符号代替 &、|、~、^。每个判断条件要⽤圆括号括起来,否则会报错
df[(df.goods =='eggplant') & (df.quantity == 12)]
选取df中 goods列值为 eggplant且 对应的 quantity值为12的所有列。
在筛选数据时候也可以使⽤loc和iloc函数实现⼦集的选取,意思并不是说上⽅的筛选语句不对,亲测同样很好⽤,⽽且代码简单了点。loc 和iloc进⾏数据筛选的格式如下:
df = df.ds=='eggplant', :]
.loc[]相当于是把想要筛选的列通过 ':'全部选出来。loc⽅法同样⽀持多条件筛选。
df = df.loc[(df.goods =='eggplant') & (df.quantity == 12), :]
loc形式的多条件筛选,条件与条件之间同样要使⽤括号分割开。这两⾏loc⽅法筛选的结果与之前没⽤loc⽅法写的代码效果是⼀样的,格式规范⽽⾔肯定是有loc的更容易让⼈理解。但是如果只是给⾃⼰写脚本完全可以⽤前⼀种,必要时候做个注释即可。
条件筛选的另⼀种形式,就是选取⼀个DataFrame中满⾜条件的⾏的某⼏列(并不是全部列)。此时只需将上⾯的代码做⼀⼩点改变即可。
df = df.loc[(df.goods =='eggplant') & (df.quantity == 12), ['goods', 'price']]
此时亲测使⽤loc⽅式会⽐较好⼀些,因为之前loc形式后⽅的 ‘:’ 代表的是满⾜条件的全部⾏的所有列的数据,⼀个冒号囊括了所有列。此时要是指定其中的某⼏列,通过list的形式,list的元素是DataFrame的列名,元素类型是字符串。上⽅的代码所表达的是满⾜条件的所有⾏的 goods 和 price 两列。
三. 数据的修改
数据的修改往往有这⼏种形式
① 针对某个值或者某个范围的值的修改。
② 增加列、删除列
③ 增加⾏、删除⾏
④修改索引
⑤修改列名
数据值的修改常见于分类的问题中,⽐如将⼀个列作为分类的列,有时候往往该列的值不是想要的数字表⽰的不同分类,或者更复杂是⼀个连续变量,此时针对DataFrame的修改就格外重要。
添加列
df['price'][df.price > 15] = 'expensive'
通过这⼀⾏代码,就将df的 price ⼀列的⼤于15的商品定义为 ‘expensive’。分类问题中不同的类常常⽤不同的数字来表⽰,⽽不同类之间的转换需要的就是这样的筛选与修改。
增加列的⽅法很简单,⽽且很常⽤,⽐如想要在之前的df中添加⼀个叫‘remain’的列,记录是否有货,可以直接使⽤下⾯的代码:
df['remain'] = 'yes'
这样就在之前的df后⾯⼜加了⼀列‘remain’,但是这⼀整列的值为‘yes’。如果不想在末尾加列,⽽是想在某列之间添加⼀列,那么就需要使⽤insert⽅法。
df.insert(int=0, column = 'remain', value='yes')
int参数传⼊的是⼀个整数,这个整数是插⼊列所在的位置,0代表列的索引为0的位置,也就是第⼀列。 column参数是设置列名。 value 值是给这列赋值,可以是字符串,如果是字符串,那么这⼀列的值都会是这个字符串;也可以是Pandas的Series,或者是Python的list。这样可以使得这⼀整列不是同⼀个值。
删除列
列的删除使⽤Pandas模块中的drop()⽅法最为⾼效。假如要删除刚才添加的remain列。
df.drop(labels='remain', axis=1, inplace=True)
上⽅这⾏代码会成功删除DataFrame中的‘remain’列,注意:如果inplace参数不指定为True,只会在内部删除,df并不会被真正改变。axis参数默认是0,也就是代表着⾏,所以删除列时要把axis改为1。
如果想删除df中多个列,drop()⽅法也是可以的。
df.drop(labels=['remain', 'quantity'], axis=1, inplace=True)
将想删除的多个列名以Python的列表形式传给labels参数,就可以在该数据框中删除列表中的列。
添加⾏
Pandas的添加⾏⽅式有很多种不过最为直观的⽅式是这样的
df.loc[3]={'goods':'shampoo','quantity':13, 'price':50}
loc⼜出现,在索引为3的⾏(第四⾏)插⼊⼀组数据。数据的形式按照字典的形式传⼊。还有⼀种⽅法是通过append⽅法。
df = df.append({'goods':'shampoo','quantity':13, 'price':50}, ignore_index=True)
也是使⽤dict形式传⼊。
删除⾏
df.drop(labels = 1, axis=0,inplace = True)
删除索引为1的⾏,axis=0表⽰横向删除⾏。删除多⾏时,传⼊labels的参数是⼀个list,元素是列的索引值。
df.drop(labels = [1, 4, 6], axis=0,inplace = True)
删除df中的索引为1,4,6的⾏。
修改索引
修改索引有两种情况,改变索引和不改变索引。
① 不改变索引,可以看做是将原始数据按照索引顺序排序
df.sort_index(axis=1,ascending=False)
axis表⽰所有列都随着索引⼀起变位置,ascending是降序的意思,默认是False。
② 改变索引
set_index()⽅法
df.set_index(keys='goods',inplace=True)
将df的goods这⼀列设置成索引,在原数据框中改。这个⽅法感觉更适合之前没有索引的情况下。当之前设置了索引的情况下需要的是reindex⽅法。
values什么意思new_index可以是Python列表,元素是现在已有的索引的⼀部分值,这个⽅法常常⽤于保留想留下的⾏。
修改列名
修改列名需要⽤到的是rename()⽅法。
这就是rename改变列名的⽤法,传⼊的形式是字典,键值是新名字;value值是原本的列名。这样的好处是做到了⼀⼀对应。之后⼀定要加上inplace参数,设置为TRUE,否则不会在原有的dataframe中改动。
数据类型转化
dataframe中的astype()⽅法是对数据类型进⾏转换的函数。以⼀个例⼦进⾏说明
df = pd.DataFrame({'id': range(4), 'age': ['13', '34', '23'], 'weight': ['45.7', '60.9', '55.5']})
df.dtypes
dtype的结果会显⽰出,id列的数据类型是 int, ⽽age和weight列的数据类型都是 object。现在将age转化为 int类型,weight转化为float类型。此时astype函数的作⽤就有所体现。
df.astype({'age':'int', 'weight':'float'})
通过字典的形式传⼊,将两列转换成了想要的数据类型。
数据排序
dataframe中索引排序⽤到的是sort_index⽅法,相似的列数值排序运⽤的是sort_values()⽅法。
df.sort_values( by=['age'], ascending=False, inplace=True)  #只通过age进⾏排序;升序;如有缺失值放在最后。
df.sort_values(by=['age', 'weight'], ascending=True, inplace=True, na_position='first') #先通过age排序,在其基础上通过weight排序;降序,缺失值放在最前⽅。
数据的排序在实际问题中很有⽤,⽐如出聚类中得分最⾼的⼏个项等等。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。