pandas 数据处理的一些方法

1.合并两个表的操作:

pandas.merge()可根据一个或者多个键将不同的DataFrame连接在一起,类似于SQL数据库中的合并操作;

例如:

import numpy as np
import pandas as pd
 
df1 = pd.DataFrame({'data1': np.arange(7), 'name': list('bbbaacd')})
df1
   data1 name
0      0    b
1      1    b
2      2    b
3      3    a
4      4    a
5      5    c
6      6    d
 
df2 = pd.DataFrame({'data2': [0, 2, 4], 'name': ['a', 'b', 'c']})
df2
   data2 name
0      0    a
1      2    b
2      4    c
 
pd.merge(df1, df2)
   data1 name  data2
0      0    b      2
1      1    b      2
2      2    b      2
3      3    a      0
4      4    a      0
5      5    c      4

2.简单数据统计

统计某一属性可能的取值:df.column_name.unique()
统计出现的次数:df.column_name.value_counts()
column_name 对应的是该 DataFrame 中某列的列名;
也即 pandas 下的 DataFrame 对象直接支持 点+列名的方式进行索引;
 

3.缺失值的处理

所有缺失值字段填充为 0:df.fillna(0),一定要十分注意的一点是,df.fillna() 操作默认(inplace=False)不是 inplace,也即不是对原始 data frame 直接操作修改的,而是创建一个副本,对副本进行修改;

舍弃那些全行为 NaN 的行,以及全列为 NaN 的行:

df.dropna(axis=[0, 1], how=’all’)


4.删除某些行和列:

df.drop([], axis=1, inplace=True) ⇒ axis = 1,删除列;
df.drop([], axis=0, inplace=True) ⇒ axis = 0,删除行;

5.均值填充

age_mean = data.Age.mean()      # age_mean = data['Age'].mean()
data.Age[data['Age'].isnull()] = age_mean   # data['Age'] == data.Age 二者是等效的

首创建具有缺失值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))

6.删除含缺失值的样本

具体处理方法:

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’])#删除含有缺失值的特定的列
df.dropna(thresh = len(df) * 0.1 , axis=1,inplace=True) 删除缺失值大于90%的变量

6.填充缺失值

数值型数值(Numerical Data)

方法一:fillna()函数

df.fillna(0):用0填充
df.fillna(method=‘pad’):用前一个数值填充
df.fillna(df2.mean()):用该列均值填充

方法二:Imputer

from sklearn.preprocessing import Imputer

imr = Imputer(missing_values='NaN', strategy='mean', axis=0)#均值填充缺失值
imr = imr.fit(df)
imputed_data = imr.transform(df.values)

7. 数据筛选
 

#-*- coding:utf-8 -*-
import pandas as pd
 
df = pd.DataFrame({'goods':['coke cola', 'eggplant','condom'], 'quantity':[12,3,1], 'price':[20,12,80]})
print df[df.goods =='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.loc[df.goods=='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 两列。
 

8.修改列

添加列

df['price'][df.price > 15] = 'expensive'

将df的 price 一列的大于15的商品定义为 ‘expensive’列

删除列

df.drop(labels='remain', axis=1, inplace=True)
上方这行代码会成功删除DataFrame中的‘remain’列,注意:如果inplace参数不指定为True,只会在内部删除,df并不会被真正改变。axis参数默认是0,也就是代表着行,所以删除列时要把axis改为1。

9.修改行

添加行:

Pandas的添加行方式有很多种不过最为直观的方式是这样的

df.loc[3]={'goods':'shampoo','quantity':13, 'price':50}

另一种方法:

df = df.append({'goods':'shampoo','quantity':13, 'price':50}, ignore_index=True)

10.修改索引

修改索引有两种情况,改变索引和不改变索引。

① 不改变索引,可以看做是将原始数据按照索引顺序排序

df.sort_index(axis=1,ascending=False)
axis表示所有列都随着索引一起变位置,ascending是降序的意思,默认是False。

② 改变索引

set_index()方法

df.set_index(keys='goods',inplace=True)
将df的goods这一列设置成索引,在原数据框中改。这个方法感觉更适合之前没有索引的情况下。当之前设置了索引的情况下需要的是reindex方法。

df.reindex(new_index,axis=0)
new_index可以是Python列表,元素是现在已有的索引的一部分值,这个方法常常用于保留想留下的行。

11.数据排序

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排序;降序,缺失值放在最前方。

12.数据去重

df.duplicated()  #检查整个dataframe中是否出现重复
df.duplicated(subset='age')  #检查age这列是否出现重复数据
df.drop_duplicates()  #删除dataframe中的重复

其中,subset参数传入的可以是单一的列名;同时也可以是多个列名组成的list。

12.数据抽样

df.sample(n=5, replace=False)
df.sample(frac=0.2, replace=True)

n参数是直接指定抽多少个样本,frac参数则是一个0到1之间的浮点数,指定的是抽取的样本占多大比例。replace表示是否是有放回的抽取,默认是FALSE。weight参数在这里没体现,这个参数是当样本具有权重时候所用的,weight参数后面加的是列名,未赋值则每列的权重默认为0,如果要赋值权重,所有权重的和为1,如果和不为1,则自动进行归一化处理。

13.频率统计

df.name.value_counts() #返不同的名字出现的次数
pd.crosstab(index=df.name, columns=df.gender)
# 这行代码,记录的是不同名字出现的次数,但是将性别分开讨论。columns参数可以传入多个列,传入形式是list,元素是列名。注意:columns传入的列必须是离散型变量,用途是用于分类。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值