1、set
set 是一个不允许内容重复的组合,而且set里的内容位置是随意的,所以不能用索引列出。可进行关系测试,删除重复数据,还可以计算交集、差集、并集等。
创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典。
2、arange和range
【1】range(start, end, step)
返回一个list对象也就是range.object,起始值为start,终止值为end,但不含终止值,步长为step。只能创建int型list。
range()函数的三种使用方法:
# range()函数的三种使用方法 # 1.仅设置终点参数,默认起点为0,步长为1,返回值范围为[起点,终点) >>>range(10) 0,1,2,3,4,5,6,7,8,9 # 2.设置起点和终点,步长默认为1,返回值范围为[起点,终点) >>>range(2,10) 2,3,4,5,6,7,8,9 # 3.设置起点、终点和步长 >>>range(1,10,2) 1,3,5,7,9 # 当设置起点、终点或步长为小数时,将会报错 >>>range(1,10,2.1) TypeError: 'float' object cannot be interpreted as an integer
【2】arange(start, end, step)
与range()类似,也不含终止值。但是返回一个array对象。需要导入numpy模块(import numpy as np或者from numpy import*),并且arange可以使用float型数据。
np.arange()函数的整数型参数设置:
# np.arange()函数的整数型参数设置 # 1.仅设置终点参数,默认起点为0,步长为1,返回值范围为[起点,终点) >>>np.arange(10) 0,1,2,3,4,5,6,7,8,9 # 2.设置起点和终点,步长默认为1,返回值范围为[起点,终点) >>>np.arange(2,10) 2,3,4,5,6,7,8,9 # 3.设置起点、终点和步长 >>>np.arange(1,10,2) 1,3,5,7,9
np.arange()函数的小数型参数设置:
# np.arange()函数的整数型参数设置 # 1.终点为小数,默认起点为0.0,步长为1.0 >>>np.arange(10.2) 0.0,1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0 # 2.设置起点和终点均为小数,步长默认为1.0,返回值范围为[起点,终点) >>>np.arange(2.1, 5.1) 2.1,3.1,4.1 # 3.设置起点、终点和步长均为小数 >>>np.arange(1.1, 5.2, 1.1) 1.1,2.2,3.3,4.4
range函数和arange函数的区别:
【1】range是Python内置的函数,直接调用即可;arange是numpy中的函数,调用时一般采用np.arange()。
【2】range()函数仅支持整数步长,np.arange()函数支持小数步长。
【3】两者数据类型不同:range()函数返回的类型为range对象,np.arange()函数返回的类型为array类型对象。
3、Python 三种取随机数方法
三种方法
- random.sample()
- random.choice()
- random.randint()
random.sample
语法:
random.sample(list, N)
【1】list: 一个数组,可以是元素数组,也可以是其他的数组。比如: numbers=[1,2,3,4,5]
【2】N: 从数组中随机取出N个
random.choice
语法:
random.choice(list)
random.randint
语法:
random.randint(N, M)
N: 起始数
M: 终止数
从N到M随机取出一个数
2、union
union 取并集,效果等同于 | ,重复元素只会出现一次,但是括号里可以是 list,tuple, 甚至是 dict
同样uninon也不能用索引列出: #TypeError: 'set' object is not subscriptable #表示把不具有下标操作的集合对象用成了对象[i]
genres_list=set() # 获取所有的电影风格 for i in moviesdf['genresls'].str.split(' '): genres_list=set().union(i,genres_list) # 集合(set)是一个无序的不重复元素序列。可以使用大括号 { } 或者 set() 函数创建集合。 genres_list=list(genres_list) genres_list genres_list.remove('') # 去除空的元素 print(genres_list)
得到的结果:所有电影风格类型
['Movie', 'Documentary', 'Comedy', 'Crime', 'Fantasy', 'History', 'Drama', 'Horror', 'Action', 'War', 'Foreign', 'Thriller', 'Fiction', 'Animation', 'Science', 'Music', 'Western', 'Romance', 'Family', 'TV', 'Mystery', 'Adventure']
例子一:
例子二:
4、ascending=False 与 reverse=False
ascending与reverse刚好是相反的
ascending=False:降序
ascending=True:升序
reverse=False:升序
reverse=True:降序
5、set_index和reset_index
set_index( )
将 DataFrame 中的指定的列转化为行索引。
set_index( ) 将 DataFrame 中的列转化为行索引。
keys : 要设置为索引的列名(如有多个应放在一个列表里)
drop : 将设置为索引的列删除,默认为True
append : 是否将新的索引追加到原索引后(即是否保留原索引),默认为False
inplace : 是否在原DataFrame上修改,默认为False
verify_integrity : 是否检查索引有无重复,默认为False
import pandas as pd data = pd.DataFrame([['Alice', 'Math', 93], ['Bob', 'Physics', 98], ['Chris', 'Chemistry', 96], ['David', 'Biology', 90]], columns=['Name', 'Subject', 'Score']) print(data) print('\n') data1 = data.set_index(keys='Name') print(data1)
reset_index
可以还原索引,从新变为默认的整型索引
6、json自定义函数提取数据
#对于json格式的数据进行分割提取,通过自定义函数 def decode(column): z=[] for i in column: z.append(i['name']) return ' '.join(z) # 获取dict中第一个元素的name值 def decode1(column): z=[] for i in column: z.append(i['name']) return ''.join(z[0:1]) #切片,只输出第一个分隔 # 获取演员列表,中间使用逗号分隔 def decodeactors(column): z=[] for i in column: z.append(i['name']) return ','.join(z) #切片,只输出第一个分隔 # 获取演员列表的前两位 def decode2(column): z=[] for i in column: z.append(i['name']) return ','.join(z[0:2]) #切片,只输出第一个分隔
# 获取电影风格数据 moviesdf['genresls']=moviesdf['genreslist'].apply(decode) # 获取演员列表 moviesdf['actorsls']=moviesdf['castlist'].apply(decodeactors) # 获取前两位演员 moviesdf['actorsn0102']=moviesdf['castlist'].apply(decode2) # 获取第一位演员 moviesdf['actorsn01']=moviesdf['castlist'].apply(decode1) # 获取制片的第一个国家或者地区 moviesdf['region']=moviesdf['countries'].apply(decode1)
7、apply 与lambda
apply通常与lambda一起使用
lambda原型为:lambda 参数:操作(参数)
lambda函数也叫匿名函数,即没有具体名称的函数,它允许快速定义单行函数,可以用在任何需要函数的地方。这区别于def定义的函数。
lambda与def的区别:
1)def创建的方法是有名称的,而lambda没有。
2)lambda会返回一个函数对象,但这个对象不会赋给一个标识符,而def则会把函数对象赋值给一个变量(函数名)。
3)lambda只是一个表达式,而def则是一个语句。
4)lambda表达式后面,只能有一个表达式,def则可以有多个。
5)像if或for或print等语句不能用于lambda中,def可以。
6)lambda一般用来定义简单的函数,而def可以定义复杂的函数。
#单个参数的: g = lambda x : x ** 2 print g(3) """ 9 """ #多个参数的: g = lambda x, y, z : (x + y) ** z print g(1,2,2) """ 9 """
例子二:
# 将一个 list 里的每个元素都平方: map( lambda x: x*x, [y for y in range(10)] )
这个写法要好过:
def sq(x): return x * x map(sq, [y for y in range(10)])
8、join
Python join() 方法用于将序列中的元素以指定的字符连接生成一个新的字符串。
语法:
str.join(sequence)
sequence – 要连接的元素序列。
返回通过指定字符连接序列中元素后生成的新字符串。
9、copy
这里将的是copy在数组切片当中的应用:数组的切片返回的是原始数组的视图,并不会产生新的数据,这就意味着在视图上的操作会使原数组发生改变。因此如果需要的并非原始图,而是复制数据,则可以通过copy的方式实现。
arr1=arr[04:-1].copy()
9、len
len函数返回对象的长度。 通常,len函数与序列(字符串, 元组 )和集合( dict , set )一起使用以获取项数。
9、append
a.append(b):是将b原封不动的追加到a的末尾上,会改变a的值,其中,b可为列表、元组、字符串、一串数/字符/字符串
【1】列表
a = [1,2,3] b = [4,5] a.append(b) print(a) #输出:[1, 2, 3, [4, 5]]
【2】元组
a = [1,2,3] b = (4,5) a.append(b) print(a) #输出:[1, 2, 3, (4, 5)]
【3】字符串
a = [1,2,3] b = 'string' a.append(b) print(a) #输出:[1, 2, 3, 'string']
【4】一串数或者字符或者字符串
如果是一串数或者字符或者字符串,则会将b转化成元组追加到a的末尾
# b是一串数字 a = [1,2,3] b = 4,5 a.append(b) print(a) #输出:[1, 2, 3, (4, 5)] # b是一串字符 a = [1,2,3] b = 'l','a','n' a.append(b) print(a) #输出:[1, 2, 3, ('l', 'a', 'n')] # b是一串字符串 a = [1,2,3] b = 'lan','tian' a.append(b) print(a) #输出:[1, 2, 3, ('lan', 'tian')]
append和join的区别
# coding=utf-8 #append # append是list(列表)的方法,函数参数是可以是任意一个元素, #作用是在列表的最后添加上这个新元素。例如a=[1,2,3]则 # a.append(4)以后a就是[1,2,3,4] a = [1,2,3] print a a.append(4) print a #join # join是string(字符串)的方法,函数参数是一个由字符串组成的列表比如['a','b','c'], #作用是用字符串把这个字符串列表里的字符串连接起来,比如: # a='-' # 则a.join(['a','b','c'])='a-b-c' a = ["hello","world","!"] #用' '隔开 b = ' ' print b.join(a) #结果:hello world ! #用':'隔开 print ':'.join(a) # 结果:hello:world:!
10、merge
pandas.merge的报错:MergeError: No common columns to perform merge on.
原因:没有共同的列来进行融合,则会报错
因为merge函数默认需要提供相同的列来进行融合,如果没有的话可以通过设置left_index
和right_index=True
来融合所有的列
解决:指定让两个df的索引相同来进行融合df.merge(s,left_index=True,right_index=True)
pd.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, validate=None)
left: 拼接的左侧DataFrame对象
right: 拼接的右侧DataFrame对象
on: 用于连接的列名。 必须在左侧和右侧DataFrame对象中找到。 如果未传递且left_index和right_index为False,则DataFrame中的列的交集将被推断为连接键。
left_on:左侧DataFrame中用于连接键的列。
right_on: 左侧DataFrame中用于连接键的列。
left_index: 左侧DataFrame中行索引作为连接键
right_index: 右侧DataFrame中行索引作为连接键
how: 有五种参数(inner,left,right,outer,cross) 默认inner。inner是取交集,outer取并集。left是包含左边的全部数据,如果右边没有相应的数据则使用NAN填充。right是包含右边的全部数据,如果左边没有则使用NAN值填充。cross表示将左右两个DataFrame进行笛卡尔积。两个数据框的数据交叉匹配,行数为两者相乘,列数为两者相加。
sort: 按字典顺序通过连接键对结果DataFrame进行排序。 默认为True,设置为False将在很多情况下显着提高性能。
suffixes: 修改重复列名。(可指定我们自己想要的后缀)
import pandas as pd price=pd.DataFrame({'fruit':['apple','grape','orange','orange'],'price':[8,7,9,11]}) amount=pd.DataFrame({'fruit':['apple','grape','orange','banana'],'amount':[1,2,2,3]}) display(price,amount,pd.merge(price,amount))
pd.merge(price,amount)
等价于pd.merge(price,amount,on='fruit',how='inner')
import pandas as pd df1=pd.DataFrame({'name1':['小1','小2','小3','小4'],'age':[25,28,39,35]}) df2=pd.DataFrame({'name2':['小1','小2','小4'],'score':[70,60,90]}) display(df1,df2,pd.merge(df1,df2))
上面这段代码报错:
原因在于df1使用的是name1,df2使用的是name2。两张表当中没有相同的字段。这种情况下就必须指定left_on,和right_on。
MergeError: No common columns to perform merge on. Merge options: left_on=None, right_on=None, left_index=False, right_index=False
11、combine_first
如上图是S5和S6,两者存在重复的索引f和g,此时使用merge和concat都无法正确的合并,因此使用combine_first。
如上图combine_first可以去除重复的索引值,原因在于s5.combine_first(s6)
表示的是使用s6去填充s5的缺失值。