数据分析

Python pandas数据分析中常用方法

2018-07-02  本文已影响22人  ced020bebb6c

读取写入文件

官方IO

读取 写入

read_csv       to_csv

read_excel      to_excel

read_hdf       to_hdf

read_sql       to_sql

read_json      to_json

read_msgpack (experimental)   to_msgpack (experimental)

read_html       to_html

read_gbq (experimental)     to_gbq (experimental)

read_stata       to_stata

read_sas

read_clipboard    to_clipboard

read_pickle      to_pickle//速度比csv快

读取CSV文件:

pd.read_csv('foo.csv')//读取CSV# header参数指定从第几行开始生成,且将header行的数据作为列的name(键),header行以前的数据将不会处理。取值为None表示csv中行不做为列的name(键),取值为0表示将csv的第0行作为列的name。| 如果没有传递参数names那么header默认为0;如果传递参数names,那么header默认为None。

1

2

存储为csv文件:

submission = pd.DataFrame({'PassengerId': test_df['PassengerId'],'Survived': predictions })submission.to_csv("submission.csv", index=False)# index参数是否写入行names键

1

2

3

选择数据

官方选择教程

官方多index选择教程

[]:

df['A']  通过列name(键)选择列df[['A', 'B']]  通过list选择列df[0:3]  通过隐含的序列(index所在行值)选择行df['20130102':'20130104']  通过行index(键)选择行dataset[(dataset['Sex'] == i) & (dataset['Pclass'] == j+1)]['Age']        #布尔运算选择数据,以其他列为条件筛选数据,注意做布尔运算时最好将每个运算用括号括起来,像以下这种就会容易出问题:dataset[dataset['TARGET'].notnull() & dataset['need_pre']!=1 ]

1

2

3

4

5

loc:

dataset.loc[ dataset.Age.isnull(),'BB']  //age不是null的数据中选择BB列train_df.loc[:, ['Age*Class','Age','Pclass']].head(10)dataset.loc[ EID,'Age']  //根据index(注意这个是index的取值,而不是index所在行)选取列Age单元数据

1

2

3

iloc:

iloc是选择DataFrame第几行第几列(类似于数组,数值下标从0开始)

df.iloc[3:5,0:2]df.iloc[1:3,:]df.iat[1,1]

1

2

3

循环行数据:

fori, rowincolTypes.iterrows():# i为dataFrame的index,row为一行数据

1

2

计算数据

重复数值个数统计:

Series.value_counts()//统计重复重现的数据的个数。返回以数据作为key,以重复个数为value的对象。X[c].value_counts().index[0]//最多的那个数

1

2

中值计算:

Series.median() //计算某个轴的中值

1

计算均值和偏差:

age_mean = guess_df.mean()# 计算均值age_std = guess_df.std()# 计算标准差

1

2

3

4

计算众值:

# freq_port = train_df.Embarked.dropna().mode()[0]# mode返回出现最多的数据,可能出现多个,因此返回数组

1

2

其他:

方法            说明

count          非NA值得数量

describe        针对series或各dataframe列计算汇总统计

min max        计算最小值和最大值

argmin,argmax    计算能够获取到最小值和最大值的索引位置(整数)

idxmin , idxmax     计算获取到最小值和最大值索引值

df.idxmax()//按列df.idxmax(axis=1)//按行

1

2

quantile        计算样本的分位数(0到1)

sum           值得总和

df.sum() //按列求和df.sum(axis=1) //按行求和

1

2

mean          值得平均数

df.mean(axis=1)//按行求和,注意,如果存在Nan值会忽略,如果整个都为nan,则取nandf.mean(axis=1, skipna =False)//禁止忽略nan值

1

2

median         值的算数中位数

mad           根据平均值计算平均绝对离差

var            样本值得方差

std            样本值得标准差

skew          样本值得偏度(三阶矩)

kurt           样本值的峰度(四阶矩)

cumsum         样本值的累计和,累计累积,也就是说从开始位置到当前位置的总和

df.cumsum()//按列求累积和,如果当前位置为nan,直接返回nan,如果不是,而前面某个位置是,则忽略前面位置的nandf.cumsum(axis=1)//按行求累积和

1

2

cummin,cummax    样本值的累计最大值和累计最小值

cumprod          样本值的累计积

diff           计算一阶差分(对时间序列很有用)

pct_change         计算百分数变化

isin           判断series,dataframe数据是否在另一个变量其中

缺失值处理

方法       说明

count      非NA值得数量

dropna      根据各标签的值中是否存在缺失数据对轴标签进行过滤,可通过阈值调节对缺失值得容忍度

fillna      用指定值或插值方法(如ffill或bfill)填充确实数据

isnull      返回一个含有布尔值的对象,这些布尔值表示哪些值是缺失值/NA,该对象的类型与源类型一样

notnull      isnull的否定式

存在三种方法来完善连续数字特征:

1、简单方式:在中值和标准偏差间产生一个随机数

2、准确方式:通过相关特征猜测缺失值

3、联合1、2基于特征组合,在中值和偏差间产生一个随机数

缺失值填充:

dataset['E'] = dataset['E'].fillna(f)# 对缺失值处进行填充0,参数value可为 scalar, dict, Series, 或者DataFrame,但不能是list;Series应用于每个index,DataFrame应用于每个列。如果不在dict/Series/DataFrame中,将不会被填充清除空值:.dropna()dataset.loc[ (dataset.Age.isnull()) & (dataset.Sex == i) & (dataset.Pclass == j+1),'Age'] = guess_ages[i,j]# 多条件填充

1

2

3

4

5

6

7

8

方法1:

fordatasetinfull_data:    age_avg        = dataset['Age'].mean()    age_std        = dataset['Age'].std()    age_null_count = dataset['Age'].isnull().sum()    age_null_random_list = np.random.randint(age_avg - age_std, age_avg + age_std, size=age_null_count)    dataset['Age'][np.isnan(dataset['Age'])] = age_null_random_list    dataset['Age'] = dataset['Age'].astype(int)

1

2

3

4

5

6

7

8

方法3:

# 生成一个空数组来存储Age的猜测值:# guess_ages = np.zeros((2,3))# guess_ages# 遍历Sex和Pclass来猜测Age猜测值:# for dataset in combine:#    for i in range(0, 2):#        for j in range(0, 3):#            guess_df = dataset[(dataset['Sex'] == i) & (dataset['Pclass'] == j+1)]['Age'].dropna()# 根据相关特征值Pclass,Sex选取数据并除空值#    age_mean = guess_df.mean()# 计算均值#    age_std = guess_df.std()# 计算标准差#    age_guess = rnd.uniform(age_mean - age_std, age_mean + age_std)# 产生随机值#    age_guess = guess_df.median()# 或计算中值#    Convert random age float to nearest .5 age#    guess_ages[i,j] = int( age_guess/0.5 + 0.5 ) * 0.5  foriinrange(0,2):forjinrange(0,3):            dataset.loc[ (dataset.Age.isnull()) & (dataset.Sex == i) & (dataset.Pclass == j+1),'Age'] = guess_ages[i,j]# 赋值dataset['Age'] = dataset['Age'].astype(int)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

填充众值:

# freq_port = train_df.Embarked.dropna().mode()[0]# mode返回出现最多的数据,可能出现多个,因此返回数组# 填充:# for dataset in combine:#    dataset['E'] = dataset['E'].fillna(freq_port)

1

2

3

4

5

查看数据

查看键和值:

train_data = pd.read_csv('train.csv')# 查看数据的行键index(index.values)、列键columns(columns.values)、值valuesprint(train_data.index)print(train_data.index.values)

1

2

3

4

查看数据统计:

train_data.info()# 主要统计有各列键非空数据数量(便于后面填充空值)、各列数据类型、及数据类型统计(一般object表示字符串对象数量)。print(train_data.describe())# 默认统计数值型数据每列数据平均值,标准差,最大值,最小值,25%,50%,75%比例。print(train_data.describe(include=['O']))# 统计字符串型数据的总数,取不同值数量,频率最高的取值。其中include参数是结果数据类型白名单,O代表object类型,可用info中输出类型筛选。print("Before", train_data.shape)# 数据行数和列数

1

2

3

4

5

6

7

8

9

10

查看部分数据内容:

# 查看前五条和后五条数据,大致了解数据内容print(train_data.head())print(train_data.tail())# 选取三条数据data_train.sample(3)

1

2

3

4

5

排序:

features.sort_values(by='EID',ascending=True)features.sort_index(axis=1,ascending=True)

1

2

python原生排序list和dictsorted([wifi for wifi in line[5]], key=lambda x:int(x[1]), reverse=True)[:5]  // 默认从小到大sorted(dict.items(),key=lambda x:x[1],reverse=True)[0][0]sorted(L, cmp=lambda x,y:cmp(x[1],y[1])) //x,y代表前后两个元素

1

2

3

4

输出格式控制:

pandas dataframe数据全部输出,数据太多也不用省略号表示。pd.set_option('display.max_columns',None)或者withoption_context('display.max_rows',10,'display.max_columns',5):

1

2

3

4

分析数据相关性

groupby数据:

train_data[['Pclass','Survived']].groupby(['Pclass'], as_index=False).mean().sort_values(by='Survived',ascending=False)# 选取数据中两列,以Pclass分组,计算每个分组内平均值,最后根据Survived平均值降序排列。其中as_index=False不以Pclass做结果行键。

1

2

分组后,可以通过size()分组内数据数量,sum()分组内数据和,count()分组内:

df = DataFrame({'key1':['a','a','b','b','a'],'key2':['one','two','one','two','one'],'data1':np.random.randn(5),'data2':np.random.randn(5)})  df#[Out]#      data1    data2 key1 key2  #[Out]# 0  0.439801  1.582861    a  one  #[Out]# 1 -1.388267 -0.603653    a  two  #[Out]# 2 -0.514400 -0.826736    b  one  #[Out]# 3 -1.487224 -0.192404    b  two  #[Out]# 4  2.169966  0.074715    a  onegroup2 = df.groupby(['key1','key2'])

1

2

3

4

5

6

7

8

9

group2.size()#[Out]# key1  key2  #[Out]# a    one    2    //注意size返回的对象2,1,1,1没有列键#[Out]#      two    1  #[Out]# b    one    1  #[Out]#      two    1  #[Out]# dtype: int64  group2.count()#[Out]#            data1  data2    #[Out]# key1 key2                #[Out]# a    one      2      2    //注意count返回的对象2,1,1,1有列键data1,data2#[Out]#      two      1      1  #[Out]# b    one      1      1  #[Out]#      two      1      1group2.sum()                        data1  data2key1    key2        a      one0.2222491.188488two0.6273730.406101b      one          -2.5274610.267850two          -0.594238-0.137129

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

自定义组内统计函数:BRA_CLOSE_DECADE = branch2[['EID', 'B_ENDYEAR']].groupby('EID').agg(lambda df:df[df['B_ENDYEAR']>2007].count())

1

2

crosstab数据:

pd.crosstab(train_data['Title'], train_data['Sex'])# 分别以Title(Mrs,Mr等)为行,Sex(female,male)为例,计算出现频数。观察二者的对应关系。

1

2

Pivot数据:

impute_grps = data.pivot_table(values=["LoanAmount"],index=["Gender","Married","Self_Employed"], aggfunc=np.mean)

1

COV(),CORR()计算

协方差cov():表示线性相关的方向,取值正无穷到负无穷。协方差为正值,说明一个变量变大另一个变量也变大;协方差取负值,说明一个变量变大另一个变量变小,取0说明两个变量咩有相关关系。

相关系数corr():不仅表示线性相关的方向,还表示线性相关的程度,取值[-1,1]。也就是说,相关系数为正值,说明一个变量变大另一个变量也变大;取负值说明一个变量变大另一个变量变小,取0说明两个变量没有相关关系。同时,相关系数的绝对值越接近1,线性关系越显著。

corrwith():计算DataFrame的列(axis=0,默认)或行(axis=1)跟另外一个Series或DataFrame之间的相关系数。

删除数据

print(df.drop(0,axis=0))#删除行,注意原数据不变,返回一个新数据print(df.drop(['col1'],axis=1,inplace=True))#删除列,inplace=True表示直接在原数据修改而不新建对象

1

2

合并数据

concat:

相同字段的表首尾相接

result= pd.concat([df1, df2, df3],keys=['x','y','z']) //keys给合并的表来源加一个辨识号

1

注意多张表concat后可能会出现index重复情况,这是最好使用reset_index重新组织下index。

result.reset_index(drop=True)

1

append方式:

# append方式result = df1.append([df2, df3])//将df2,df3追加到df1后返回# [官方合并教程](http://pandas.pydata.org/pandas-docs/stable/merging.html#)

1

2

3

merge方式:

merge(left, right, how=’inner’, on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=True, suffixes=(‘_x’, ‘_y’), copy=True, indicator=False)

merge方式用于通过一个或多个键将两个数据集的行连接起来,类似于 SQL 中的 JOIN

on=None 用于显示指定列名(键名),如果该列在两个对象上的列名不同,则可以通过 left_on=None, right_on=None 来分别指定。或者想直接使用行索引作为连接键的话,就将left_index=False, right_index=False 设为 True。如果没有指定且其他参数也未指定则以两个DataFrame的列名交集做为连接键.

how=’inner’ 参数指的是当左右两个对象中存在不重合的键时,取结果的方式:inner 代表交集;outer 代表并集;left 和 right 分别为取一边。

suffixes=(‘_x’,’_y’) 指的是当左右对象中存在除连接键外的同名列时,结果集中的区分方式,可以各加一个小尾巴。

>>>>阅读全文

上一篇 下一篇

猜你喜欢

热点阅读