利用python进行数据分析–阅读笔记

[toc]

为什么

数据挖掘的优化还是逃不掉的呀,毕竟写了python可是python的优势都没有用上,各种库包,没有用到.还是java那一套,感觉不对的使用体验.为了程序的运行,我还是先学一波,然后对原有的for循环和python数据结构进行修改. 目的: 提高运行速度

pandas

基础结构

DataFrame:二维数据结构:行和列
Series: 一维的 类似于DataFrame的一列

# data type of columns
df.dtypes
# indexes
df.index
# return pandas.Index
df.columns
# each row, return array[array]
df.values
# a tuple representing the dimensionality of df
df.shape

data['w']  #选择表格中的'w'列,使用类字典属性,返回的是Series类型

data.w    #选择表格中的'w'列,使用点属性,返回的是Series类型

data[['w']]  #选择表格中的'w'列,返回的是DataFrame类型

data[['w','z']]  #选择表格中的'w'、'z'列

data.head()  #返回data的前几行数据,默认为前五行,需要前十行则data.head(10)
data.tail()  #返回data的后几行数据,默认为后五行,需要后十行则data.tail(10)

data.iloc[-1]   #选取DataFrame最后一行,返回的是Series
data.iloc[-1:]   #选取DataFrame最后一行,返回的是DataFrame

data.loc['a',['w','x']]   #返回‘a’行'w'、'x'列,这种用于选取行索引列索引已知

data.iat[1,1]   #选取第二行第二列,用于已知行、列位置的选取。

输入

import pandas as pd
# 使用pandas 进行操作
# 读取 文件时候,可以指定列是什么,
bought=['uid','itemid','time']
bought_history=pd.read_table('../clean/user_bought_history.txt',sep=' ',header=None,names=bought)
# 这样的bought_history 就是一个dataframe
# sep 分割列的,names设置列名的

# 或者通过一个 list[]生成
item_list=[]
bought=pd.DataFrame({'itemid':item_list}) # 这样也是指定了列名的。

# 写入到文件
bought.to_csv('文件名.格式')# txt 或者csv都行的
bought.to_csv("./matched.txt",index=False,sep=' ',header=0)#

# index:设置 索引值,默认显示输出从 1开始
# sep 设置用什么分割列,默认是','
# header=0 :设置是否出现列名,开头第一行是否有列名

sql操作

  • select:
    print df.loc[1:3, ['total_bill', 'tip']]
    print df.loc[1:3, 'tip': 'total_bill']
    print df.iloc[1:3, [1, 2]]
    print df.iloc[1:3, 1: 3]
    
  • where
    # and
    print df[(df['sex'] == 'Female') & (df['total_bill'] > 20)]
    # or
    print df[(df['sex'] == 'Female') | (df['total_bill'] > 20)]
    # in
    print df[df['total_bill'].isin([21.01, 23.68, 24.59])]
    # not
    print df[-(df['sex'] == 'Male')]
    print df[-df['total_bill'].isin([21.01, 23.68, 24.59])]
    # string function
    print df = df[(-df['app'].isin(sys_app)) & (-df.app.str.contains('^微信\d+$'))]
    

    类似于where语句进行查询

  • drop去重
    df.drop_duplicates(subset=['sex'], keep='first', inplace=True) subset 是设置对某列去重,但是默认是全部列,keep保留重复元素中的第一个、最后一个. inplace ,默认为False,返回一个新的dataframe;若为True,则返回去重后的原dataframe

  • group分组:df.group('列')

    print df.groupby('sex').size()
    print df.groupby('sex').count()
    print df.groupby('sex')['tip'].count()
    
  • as:重新命名即可df.rename(columns={'total_bill': 'total', 'tip': 'pit', 'sex': 'xes'}, inplace=True)
  • 排序:order df.sort_values()
  • 替换:replace 全局的修改,可以使用where选择加loc也可以:
    df.replace({'sex': {'Female': 'Sansa', 'Male': 'Leone'}}, inplace=True)
    df.loc[df.sex == 'Male', 'sex'] = 'Leone'
  • 除了上述SQL操作外,Pandas提供对每列/每一元素做自定义操作,为此而设计以下三个函数:
    map(func),为Series的函数,DataFrame不能直接调用,需取列后再调用;
    apply(func),对DataFrame中的某一行/列进行func操作;
    applymap(func),为element-wise函数,对每一个元素做func操作
    print df['tip'].map(lambda x: x - 1)
    print df[['total_bill', 'tip']].apply(sum)
    print df.applymap(lambda x: x.upper() if type(x) is str else x)

此sql操作参考博客:

集合操作

这个是重点的东西
就是sql的连接 也有左右连接;

# merge默认按相同字段合并,且取两个都有的。on 用于连接的列名
new_data=pd.merge(df1,df2)

# 当左右连接字段不相同时,使用left_on,right_on
pd.merge(df1,df2,left_on="name",right_on='call_name')

# 合并后,删除重复的列
pd.merge(df1,df2,left_on='name',right_on='call_name').drop('name',axis=1) # 删除 name重复的 取出现的

# how 连接方式:‘inner’(默认);还有,‘outer’、‘left’、‘right’
# outer 外连接,取并集,并用nan填充
# left 左连接, 左侧取全部,右侧取部分”
# right 有连接,左侧取部分,右侧取全部”

注意:merge要保证列的类型一样 必要时用dtypes输出看一下,因为有时候输入为int 和str类型就不能相等,而且还不报错. 这个超级坑.

下载

pdf下载链接: —-利用Python进行数据分析


评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注