python list转换成array_数据分析|Python基本数据结构

- 点击上方“中国统计网”订阅我吧!- a782bbfdb5d058519455038b08b502a5.gif

近来,工作上需要用到Python进行数据类型准换与数据处理,自己感觉处理这类需求很生硬,于是便在网上找来文档,加以学习。这次突击学习,感觉对python的使用更加得心应手了,也感觉到那句至理名言,“解决问题是学习语言最好的方式”,实在经典。

各位小可爱,显然python又是一个系列,大家期待吧。我会以数据分析师的角度来写这个模块,保持一周至少一更的进度快速完成这个系列。(立个flag,过年前完成吧)

操作环境:
python3.7Anaconda jupyter notebook没有操作环境的,可以参考:https://zhuanlan.zhihu.com/p/64374324全文目录python自带的基本数据结构:可变数组与不可变数组python分析库:Numpy:多维数组Pandas:Series,DataFrame

前记

Python 里面索引有三个特点 (经常让人困惑):

从 0 开始 (和 C 一样),不像 Matlab ,R从 1 开始。 切片通常写成 start:end 这种形式,包括「start 索引」对应的元素,不包括「end索引」对应的元素。因此 s[2:4] 只获取字符串第 3 个到第 4 个元素。 索引值可正可负,正索引从 0 开始,从左往右;负索引从 -1 开始,从右往左。使用负数索引时,会从最后一个元素开始计数。最后一个元素的位置编号是 -1。

不可变数组

python基本数据类型可以分为:可变数组与不可变数组,我不会面面俱到,挑要紧的写。

字符串

#Python 字符串不能被改变,可以添加索引 a='string' #a[0]='c' #非法 print(a[0]) #合法 print (a * 2)      # 输出字符串两次 print (a + "TEST") # 连接字符串

元组

#元组(tuple)与列表类似,不同之处在于元组的元素不能修改!tup1 = ()    # 空元组tup2 = (20,) # 一个元素,需要在元素后添加逗号, 否则会被误认为是字符串print(tup2)  #(20,)nested=(1,2,3,'python'),(2,3,'R') #二维元组print(type(nested)) #print(nested) #((1, 2, 3, 'python'), (2, 3, 'R'))

元组索引与切片

nested = (1, 10.31, 'python'), ('data', 11)nested[0]print( nested[0][0], nested[0][1], nested[0][2],nested[1][1] ) #1 10.31 python 11nested[0][0:2]  #(1, 10.31)

可变数组

列表

#可以被索引,可以更改(不同于字符串),列表中元素的类型可以不相同,+,*依旧有效;a = [1, 2, 3, 4, 5, 6] a[0] = 9 #通过索引改列表 del a[2] #删除列表元素

插播一条:python内置append追加,extend扩展,insert插入,pop删除

'''append()将整体内容追加到尾巴'''a = [1, 2, 3, 4, 5, 6]a.append([8,0])print(a) # [1, 2, 3, 4, 5, 6, [8, 0]]'''extend()将整体内容zhong的每个元素添加到列表后'''a.extend(['python',8])print(a)  #[1, 2, 'abc', 3, 4, 5, 6, [8, 0], 8, 'python', 8]'''insert(i,x) 在编号 i 位置前插入 x'''a.insert(0, 'abc') print(a) #['abc', 1, 2, 'abc', 3, 4, 5, 6, [8, 0], 'python', 8]'''remove是指定具体要删除的元素,比如 'python'pop是指定一个编号位置,比如 3,删除 l[3] 并返回出来'''a.remove('python')print(a) #[1, 2, 'abc', 3, 4, 5, 6, [8, 0], 8, 8]a.pop(0)print(a)#[2, 'abc', 3, 4, 5, 6, [8, 0], 8, 8]

字典

#字典是无序的对象集合,不能通过索引,但可以通过键找值(键唯一);构造字典方法很多;

键(keys),值(values),对(items)d = {'Name' : 'Tencent','Country' : 'China','Industry' : 'Technology','Code': '00700.HK','Price' : '361 HKD'}#print (b[0]) #错误!字典是无序的,只能通过键来引用。print (d['Name'])#合法a={} #构造空字典'''获取字典的键--值--对'''print( list(d.keys()),'\n' )print( list(d.values()), '\n' )print( list(d.items()) )输出['Name', 'Country', 'Industry', 'Code', 'Price'] ['Tencent', 'China', 'Technology', '00700.HK', '361 HKD'] [('Name', 'Tencent'), ('Country', 'China'), ('Industry', 'Technology'), ('Code', '00700.HK'), ('Price', '361 HKD')]

集合

#集合区分其它数据类型很大一个特点就是:集合可以进行交集,差集,补集的运算;集合无序唯一,所以不能通过index进行索引#创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典。a = set('abracadabra')b = set('alacazam')print(a)         #a是去除重复值print(b)print(a - b)     # a 和 b 的差集print(a&b)       #a 和b的交集print(a|b)       #a和b的并集输出{'a', 'c', 'r', 'd', 'b'}{'m', 'a', 'c', 'z', 'l'}{'d', 'b', 'r'}{'c', 'a'}{'m', 'a', 'c', 'z', 'r', 'l', 'd', 'b'}

数据类型转换

#list() 方法用于将元组,字符串,字典,集合转换为列表;其中,字符串转换成列表,是将字符串中的每个字符转换成列表的一个元素aTuple = (123, 'Google')list1 = list(aTuple) #原组转换列表print ("列表元素 : ", list1)列表元素 :  [123, 'Google']#tuple()将列表,字符串,字典,集合转换为元组;字符串都被单一拆分开来了;list1= ['Google', 'Taobao']b=tuple(list1)print (b)('Google', 'Taobao')

Numpy之多维数组

Numpy(多维数组)中经常用到:shape,reshape,random,通用函数,聚合函数,索引与切片import numpy as npimport pandas as pdx=np.array([1,2,3,4])print(x.shape[0])#统计一维数组的个数#print(x.shape[1]) errory=np.array([['a',2],[2,3],[3,4]]) #二维数组就是在[]里创建[]print(y)print('---'*6)print(y.shape[0]) #输出二维数组的个数3print(y.shape[1]) #输出维度2

数组切片

print(y[:,1]) #切片,相当于输出第二列print(y[1])# 等价于y[1,]输出第二行print(y[1,1])print(y[1][1])#print(y[,1])#报错,print(y[:,1])[2 3 4][2 3]33[2 3 4]

数组遍历

import numpy as npa=np.arange(6).reshape(3,2)print(a)#迭代二维数组的每一个元素for item in a.flat:    print(item)print('---'*6)#更优雅的数组遍历方法b=np.apply_along_axis(np.mean,axis=0,arr=a)#axis=0,按列操作,np.mean可以替换为自定义函数c=np.apply_along_axis(np.mean,axis=1,arr=a)print(b)print(c)#选择数组元素:{数字:索引/切片;逻辑条件:布尔}e=a[a>2]print(e)[[0 1] [2 3] [4 5]]012345------------------[2. 3.][0.5 2.5 4.5][3 4 5]

多维数组排序

a = np.array([[4,3,2],[2,4,1]])print(a)print('---'*6)print (np.sort(a))print('---'*6)print (np.sort(a, axis=None))#axis=none打通格式将矩阵看作向量进行全排print('---'*6)print (np.sort(a, axis=0)  )#多维数组按列排序print('---'*6)print (np.sort(a, axis=1)  ) #axis=1(按照行排序)[[4 3 2] [2 4 1]]------------------[[2 3 4] [1 2 4]]------------------[1 2 2 3 4 4]------------------[[2 3 1] [4 4 2]]------------------[[2 3 4] [1 2 4]]

多维数组的集合运算

arr = np.array([1,3,2,5,2,4,2,2,1,4,5,2])np.unique(arr)#去除重复值print(set(arr))#去除重复值x = np.array([1,2,4,5])y = np.array([3,4,5])np.intersect1d(x,y) #取交集np.union1d(x,y) #取并集np.setdiff1d(x,y) #在x不在y中{1, 2, 3, 4, 5}array([1, 2])

Pandas之Series

import numpy as npimport pandas as pdobj2 = pd.Series([4,7,-5,3],index=['d','b','a','c'])print(obj2[1])#引用一个元素一个中括号print('---'*6)print(obj2['b'])print('---'*6)print(obj2[[1,2]]) #利用下标索引时两个中括号print('---'*6)print(obj2['d':'a'])#切片:时一个中括号print('---'*6)print(obj2[['d','c']])#利用index索引时两个中括号7------------------7------------------b    7a   -5dtype: int64------------------d    4b    7a   -5dtype: int64------------------d    4c    3dtype: int64

Series可以通过重建索引来填充数据

obj2 = pd.Series([4,7,-5,3],index=['d','b','a','c'])obj4 = obj2.reindex(['a','b','c','d','e'],fill_value=0)#可以使用fill_value进行填充print(obj4)#reindex函数还有一个method属性,进行差值填充,但是索引必须是单调递增或者单调递减的,所以一般用在时间序列这样的有序数据中:ffill前索引编号对应元素;bfill:后面索引对应元素。obj3 = pd.Series(['blue','Purple','yellow'],index = [0,2,4])obj3.reindex(range(6),method='ffill')

Series 唯一值,计数

obj = pd.Series(['c','a','d','a','a','b','b','c','c']) #默认index从0开始uniques = obj.unique()#value_counts()返回各数的计数obj.value_counts()c    3a    3b    2d    1dtype: int64

Series 排序

#Series是一维序列,按照index和values进行排序。#按照index排序,sort_index是按照index进行排序,而不是index对应的值;index变动,values跟着变动!obj = pd.Series(range(4),index=['d','a','b','c'])obj.sort_index()a    1b    2c    3d    0dtype: int64#按照values排序,obj.sort_values()d    0a    1b    2c    3

Pandas之DataFrame

import pandas as pdfrom pandas import Series, DataFramedata = {'Chinese': [66, 95, 93, 90,80],'English': [65, 85, 92, 88, 90],'Math': [30, 98, 96, 77, 90]}df1= DataFrame(data)df2 = DataFrame(data, index=['ZhangFei', 'GuanYu', 'ZhaoYun', 'HuangZhong', 'DianWei'], columns=['English', 'Math', 'Chinese'])print (df1)print(df2)Chinese  English  Math0       66       65    301       95       85    982       93       92    963       90       88    774       80       90    90            English  Math  ChineseZhangFei         65    30       66GuanYu           85    98       95ZhaoYun          92    96       93HuangZhong       88    77       90DianWei          90    90       80

DataFrame索引与切片

import pandas as pdimport numpy as npdata = pd.DataFrame(np.arange(16).reshape((4,4)),index = ['Ohio','Colorado','Utah','New York'],columns=['one','two','three','four'])print(data[:2])#取第0,1行print('-'*30)print(data[2:])#从第2行开始取print('-'*30)print(data[['one','three']]) #取对应的列print('-'*30)print(data.loc[['Ohio','Colorado'],['one','two']])#切片灵活取数,如果是标签要加loc函数print('-'*30)print(data.iloc[[1,2],[2,3]])#切片灵活取数,如果是数字下标要加iloc函数

DataFrame 修改数据:通过列表

data = {    'state':['Ohio','Ohio','Ohio','Nevada','Nevada'],    'year':[2000,2001,2002,2001,2002],    'pop':[1.5,1.7,3.6,2.4,2.9]}frame2 = pd.DataFrame(data,index=['one','two','three','four','five'],columns=['year','state','pop','debt']) #可以通过columns指定列名frame2['debt']=16.5 #重新给列赋值print(frame2)print('-'*30)frame2['debt']=np.arange(5)#可以使用一个列表来修改DataFrameprint(frame2)print('-'*30)val = pd.Series([-1.2,-1.5,-1.7],index=['two','four','five'])frame2['debt'] = val #可以使用一个Series,此时会根据索引进行精确匹配print(frame2)      year   state  pop  debtone    2000    Ohio  1.5  16.5two    2001    Ohio  1.7  16.5three  2002    Ohio  3.6  16.5four   2001  Nevada  2.4  16.5five   2002  Nevada  2.9  16.5------------------------------       year   state  pop  debtone    2000    Ohio  1.5     0two    2001    Ohio  1.7     1three  2002    Ohio  3.6     2four   2001  Nevada  2.4     3five   2002  Nevada  2.9     4------------------------------       year   state  pop  debtone    2000    Ohio  1.5   NaNtwo    2001    Ohio  1.7  -1.2three  2002    Ohio  3.6   NaNfour   2001  Nevada  2.4  -1.5five   2002  Nevada  2.9  -1.7

DataFrame 重建索引:

frame = pd.DataFrame(np.arange(9).reshape((3,3)),index=[1,4,5],columns=['Ohio','Texas','California'])frame2 = frame.reindex(index=[1,2,4,5]) #没匹配上则为Naprint(frame2)frame3=frame.reindex(index=[1,2,4,5],method='bfill')print(frame3)Ohio  Texas  California1   0.0    1.0         2.02   NaN    NaN         NaN4   3.0    4.0         5.05   6.0    7.0         8.0   Ohio  Texas  California1     0      1           22     3      4           54     3      4           55     6      7           8states = ['Texas','Utah','California']df=frame.reindex(columns=states)print(df)print('---'*6)num=df.isna().sum() #按列统计NaN个数print(num)df['Utah'].fillna(df['Texas'].mean(),inplace=True) #按照列进行替换print(df)   Texas  Utah  California1      1   NaN           24      4   NaN           55      7   NaN           8------------------Texas         0Utah          3California    0dtype: int64   Texas  Utah  California1      1   4.0           24      4   4.0           55      7   4.0           8

DataFrame排序

frame = pd.DataFrame(np.arange(8).reshape((2,4)),index=['three','one'],columns=['d','a','b','c'])print(frame)print('-'*30)print(frame.sort_index(0))#按照index标签排序(竖着)且默认升序print('-'*30)print(frame.sort_index(1,ascending=False)) #按照index进行排序(横着,相当于对columns标签进行排序),默认升序,降序可在括号加ascending=Falseprint('-'*30)print(frame.sort_index(by=['a','b']))#按照指定列的值排序print('-'*30)print(frame.sort_values(by=['a','b'])) #按照指定列的值排序      d  a  b  cthree  0  1  2  3one    4  5  6  7------------------------------       d  a  b  cone    4  5  6  7three  0  1  2  3------------------------------       d  c  b  athree  0  3  2  1one    4  7  6  5------------------------------       d  a  b  cthree  0  1  2  3one    4  5  6  7------------------------------       d  a  b  cthree  0  1  2  3>
最后,分享两个小技巧:

查找空值

frame = pd.DataFrame(np.arange(9).reshape((3,3)),index=[1,4,5],columns=['Ohio','Texas','California'])states = ['Texas','Utah','California']df=frame.reindex(columns=states)df.isnull() #争对数据表查找空值df.isnull().any() #想知道哪列存在空值Texas         FalseUtah           TrueCalifornia    Falsedtype: bool

匿名函数应用于列

#另一个常见的操作是,将函数应用到由各列或行所形成的一维数组上。DataFrame的apply方法即可实现此功能。frame = pd.DataFrame(np.random.randn(3,3),columns=list('bcd'),index=['Ohio','Texas','Colorado'])print(frame)f = lambda x:x.max() - x.min()print(frame.apply(f)) #默认axis=0,按照列print(frame.apply(f,axis=1))#axis=1,按照行                 b         c         dOhio     -0.902066 -1.426849  0.257044Texas    -0.111319  1.444429 -0.880473Colorado  0.374568 -1.097012  0.294518b    1.276634c    2.871279d    1.174992dtype: float64Ohio        1.683894Texas       2.324903Colorado    1.471580dtype: float64
End 作者:求只鸟 来源:知乎

零基础入职数据分析就业班

课程的形式主要是“直播+录播”

报名专享:课程项目作业+1v1班主任监督学习+爱数据学院学员专属网站+班级答疑群

课程结束后能熟练掌握SQL、Python、Excel、PPT等工具

适合人群:

1.转行(岗位相关,专业相关、对数据分析感兴趣)2.从事数据分析工作,但是需要提升技能以及增加实战经验3.应届毕业生入职数据分析

3a007b20cfd6c2d128ba8861521840bb.png 609a49ba8694b072cd3abfc21bdb3db8.gif
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值