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传入的列必须是离散型变量,用途是用于分类。