用numpy和pandas进行数据分析

摘要

入门
1.Series
2.DataFrame
3.pandas io 操作
4.indexing & Selecting
5.reindx(对列,行)
6.Nan
7.多级index
8.map和replace
进阶
1.Series,DataFrame简单计算(加减乘max,min,describe)
2.Series,DataFrame排序
3.DataFrame重命名
4.DataFrame的merge
5.Concatenate和Combine(结合,填补)
6.用apply处理数据
7.Series,DataFrame中用duplicated去重
8.时间序列简单操作
9.时间序列的采样和画图
10.数据分箱技术Binning
11.数据分组技术Groupby
12.数据聚合技术Aggregation
13.透视表
14.分组和透视功能实战

一、NUMPY

1.创建ndarray

import numpy as np
import numpy as np #导入numpy
a1=np.array([1,2,10,4]) #利用列表构建一维数组, array里得是同一数据类型,可以是列表,元组,数组或其他序列
a2=np.array([[1,2,3,4],[4,15,6,17]])#利用列表构建二维数组,可以理解为矩阵
a3=np.zeros(10)  / zeros_like
a4=np.ones(5)   /  ones_like
a5=np.empty((2,2,3))
a6=np.arange(10)
a7 = np.eye(6)

2.数据类型

hot=np.dtype([('name',np.str_,10),('number',np.int64),('price',np.float64)])
print(hot)
a8= np.array([1,2,3],dtype=np.float64)
a9=a8.astype(np.int64) #转换数据类型

3.数据读入

import numpy as np
raw_DATA =
raw_data = np.loadtxt('coupon_nm_new.csv',delimiter=",",dtype=hot)

4.索引和切片

#索引第3家店铺
shop[2]
#索引第3家到第5家店铺
shop[2:6]
#赋值操作
shop[2:5]=6
#多维数组索引
arr=np.array([raw_data['团购活动ID'],raw_data['团购名'],raw_data['购买人数']])
#数组索引
arrt[0,0:3]
#通过布尔值进行索引(赋值的运算会产生布尔型数组)
raw_data[raw_data['购买人数']==50]
raw_data[(raw_data['购买人数']=50)|(raw_data['团购名']!='a')]  &() |()  andor无效
#当把值赋值给一个切片时,该值会传播到整个选区
a1 = np.array([0,1,2,3,4,5,6,7,8,9])
a2 = a1[5:8]
a2[0] =999 然后a1[5]会变成999

5.数组转置和轴对换

用numpy和pandas进行数据分析_第1张图片

6.统计分析及函数

#用numpy进行统计分析 sum mean std  var min max
price=raw_data['团购价']
price.sort()
print('排序后团购价为:',price)
np.sum(price)
np.mean(price)
np.var(price)
np.max(price)
np.min(price)

#其他函数
np.sqrt(price)
np.square(price)
np.exp(price)
np.randn(8) #反回标准正态分布的随机数
np.maximum(数组一,数组二)

7.唯一化

用numpy和pandas进行数据分析_第2张图片

二、Pandas

1.Series

用numpy和pandas进行数据分析_第3张图片

2.DataFrame

用numpy和pandas进行数据分析_第4张图片

3.读取文件

raw_data = pd.read_excel('文件名')
raw_data2 = pd.read_csv('文件名') #文件放在pycharmproject里
raw_data3 = pd.read_excel(r'F://````地址')

4.索引和切片

# 筛选某一列的值,返回符合条件的所有行
 df1[df1[column1] == value1]

 # 筛选某一列的值,返回符合条件的某一列
 df1[column2][df1[column1] == value1]

 # 筛选多列的值,返回符合条件的所有行
 df1[df1[column1] == value1][df1[column2] == value2][...]

# 筛选多列的值,返回符合该条件的多列
df1[[column1, column2]][df1[column1] == value1][...]

raw_data.iloc[1,:] = raw_data.iloc[0,:]# 第一行赋值给第二行

#Series.iloc[第几行][第几列]

# 或raw_data.loc[第几行,列名]

#其中第几行不用数字,用值的话,需要先  raw_data.set_index('Team') 再 raw_data.loc[['TeamA’,'TeamB'],列名]


选择其中一列元素 raw_data[column1]
    选择两列元素 raw_data[[column1,column2]] 
    选择评分大于3.5的商家所有信息 raw_data[raw_data['评分']>3.5]
    打印所有列名 raw_data.columns
    得到每一行的所有值raw_data.values
    人均这列所有元素+100  raw_data['人均']+100
    按人均排序,从小到大 raw_data.sort_values(['人均'],ascending=true)
    按index排序 raw_data.sort_index()

5.排序和排名

对索引值进行排序

a.sort_index()#默认升序
a.sort_values(by=[‘a’,''b],axis=0,ascending=[False,True])#先按a列降序,再按b列升序

6.描述统计

raw_data.describe()  #生成描述统计
raw_data.idxmax(最大值的索引)#最大值的索引
raw_data.max()
quantile\sum\mean\median\mad\var\std\cumsum
corr\cov\count

7.唯一值、缺失值

唯一值
显示具体的唯一值

df['col'].unique()

显示列唯一值个数

df['col'].nunique()

缺失值

a.unique()
is_null_data = raw_data[raw_data['评价数'].isnull() == True]
raw_data5 =raw_data[raw_data['评价数'].isnull() == False] #去掉缺失值后的数据

8.清洗数据

1.移除重复值

df.duplicated()#返回布尔型Series 表示各行是否有重复行
df.drop_duplicates() #返回移除了重复行后的数据
filter_words = ['人均:','人均','大概','左右','差不多']
for  i in range(len(raw_data)):
    value = raw_data['人均'].iloc[i]
    if type(value) is int or type(value) is float:
        continue
    for word in filter_words:
        if word in value:
            raw_data.loc[i,'人均'] = raw_data.loc[i,'人均'].replace(word,'')
print(raw_data.head())


#apply() 可以随意调用任何函数
def clean_price(x):
     filter_words = ['人均:', '人均', '大概', '左右', '差不多']
     if type(x) is int or type(x) is float:
         return x
     for word in filter_words:
        if word in value:
            x = x.replace(word, '')
     return x

9.聚类

def cate_shops(x):
    if x <=2:
        return 0
    if x > 2 and x <= 3.5 :
        return 1
    if x > 3.5:
        return 2
raw_data['商家等级'] = raw_data['评分'].apply(cate_shops)
cata =raw_data.groupby(by=['商家等级']).agg({'人均':'mean'})  #根据商家等级列合在一起 再用agg相加
print(cata)

10.数据表连接

pd.concat([df1,df2,df3]) #数据拼接
pd.merge(left,right,on='key') #主键相同进行内连接
pd.merge(left,right,on=['key1','key2']) #多个主键内连接
pd.merge(left,right,how='left',on=['key1','key2']) #多个主键 左连接
#两个表列名不同时,left_on='a',right_on='b'

常用操作

  • 查看数据属性
df.columns #查看有哪些列
df.index #查看索引
df.dtypes #查看每列的数据类型
df.info()#查看各列数据的数据类型
df.shape #查看行列的大小
df.size #查看有多少单元格
len(df)#查看行数
  • 常用方法
df.head() 返回前几行
df.tail() 返回倒数几行
df.rename(columns={'height':'Height'},inplace=True) 修改列名
df['animal'].replace('snake','python') 指定数据替换
df.collage.value_counts() 查看列为collage中元素的计数
df.sort_values(by=['Height','Weight']) 依据指定列进行排序,默认升序
df.sort_values(by=['b','a'],axis=0,ascending=[False,True]) 先对b列降序,后对a列升序
df.describe() 查看描述性统计的相关信息
max\min\sum\mean 不知道轴axis时 默认对列运算
df['visits'].sum() 对指定列求和
  • 轴的使用
    axis:
    0值表示沿着某一列或行标签\索引值
    向下执行方法
    1值表示沿着某一行或列标签横向执行对应的方法
  • 增加删除列的操作
df['class1'] = 1 #增加列,每次只能增加一列
df.loc['k'] = [3,'cat','no',6] #增加行名为k的一行数据
del df['class1'] #删除class1列
df.drop(labels='k',inplace=True) #删除增加的名为k行数据
df = df.drop('k')
  • 缺失值和文本字符串的处理
    • 缺失值
pd.isnull(df) 返回所有数据的检测结果
pd.isnull(df['a']) 对某列数据进行检测
pd.dropna(axis=0,how='any',thresh=None,inplace=False)
# any:如果存在任何NA值,则放弃该标签
# all:如果存在的值为NA值,才放弃该标签
# thresh=n 保留至少n个非NaN数据
# inplace:筛选过缺失值的新数据是保存副本还是直接在原数据上修改
df.fillnal(value=0)0填充缺失值
len(df.loc[(df['a'].isnull(),'a')]) 查看某列缺失值的个数
  • 文本数据(字符串处理)
s =pd.Series(['A','B','C','Abba','CABA'])
s.str.strip() 去除首位空格

s.str.upper() 转为小写
s[s.str.strip().str.endswith('a')] 选取以a为结尾的数据
df['player'].str.spilt('') 对指定列数据进行分割
df['player'].str.spilt('',expand=True) 使用expand方法,将分割出的数据单独生成一列
sd['player'].str[:3] 使用[]对字符串进行切片提取

文本字符串在处理前,要先转为字符(.str)在进行处理
  • 设置索引和索引提取数据(loc、iloc)
  1. set_index()设置多重索引
new_df = df.set_index(keys=['a','b'],append=False,drop = false)
append 是否将原索引保存
drop是否保存转换为索引的列数据
  1. sort_index 将索引进行排序
new_df.sort_index(na_position=‘last’,inplace=True)
na_position='last'指将缺失值放在最后进行显示
  1. 切片(slicers)对多重索引操作
    slice表达的是范围,有几重索引就写几个条件,用冒号代表去全部的列
    第一重索引取值范围0-1000
    第二重索引取值为给定值
    第三重索引没给限定条件
new_df.loc[(slice(0,1000),['a','b'],slice(None)),:]
  1. reset_index还原索引
new_df.reset_index(drop=True

iloc是按照位置索引,loc是按照名称索引

  • 数据的查询、修改、分组计算

1.查询

df[ (df['a']>=2000) | (df['a']<=1700)] #条件为或
df[ (df['a']>=2000) & (df['a']<=1700)] #条件为和
df.loc[(df['a']>=10) &(df['b']>8)]
df[ (df['a']>=10) & (df['b']>=8)]

2.修改

df.loc[df['a']=='yes','a'] ='True' #只是修改了值,并未修改数据类型
df['a'] =df['a'].map({'yes':True,'no':False}) #值和数据类型都修改

3.分组计算

  • 分组查看每组大小
df.groupby(‘a’).size() 
  • 单个统计量
grouped['a'].sum() #grouped是储存分组数据的变量
  • 多个统计量
grouped['a'].agg([np.mean,np.sum])
  • 对所有列球多个统计量
grouped['a'].agg([np.mean,np.sum])
  • 不同列球不同统计量
grouped['a'].agg({'a':np.mean,'b':np.sum})

你可能感兴趣的:(数据分析,数据分析,python)