python 语法小进阶1

2023-05-16

1、filter 是通过生成 True 和 False 组成的迭代器将可迭代对象中不符合条件的元素过滤掉;而 map 返回的则是 True 和 False 组成的迭代器。

>>> res1 = map(lambda n: n > 5, range(10))
>>> lt1 = list(res1)
>>> print(lt1)
[False, False, False, False, False, False, True, True, True, True]

>>> res2 = filter(lambda n: n > 5, range(10))
>>> lt = list(res2)
>>> print(lt) 
[6, 7, 8, 9]

map和filter都是迭代器,用一次就没了!小心之前用print函数直接把他用没了。

2、 用lamda表达式和map函数对数据进行整理。

原来的数据为:

ace 
bd  
bc  
abcd
ab  
bc  
ab  
abce
abc 
ace 

 

#使用Apriori算法挖掘菜品订单关联规则
from __future__ import print_function
import pandas as pd
# from apriori import * #导入自行编写的apriori函数

inputfile = '../data/menu_orders.xls'
outputfile = '../tmp/apriori_rules.xls' #结果文件
data = pd.read_excel(inputfile, header = None)
print(type(data))
print(u'\n转换原始数据至0-1矩阵...')
ct = lambda x : pd.Series(1, index = x[pd.notnull(x)]) #转换0-1矩阵的过渡函数
b = map(ct, data.as_matrix()) #用map方式执行
# print(list(b))
# print(pd.DataFrame(list(b)))
data = pd.DataFrame(list(b)).fillna(0) #实现矩阵转换,空值用0填充
print(list(b))
print(data)
print(u'\n转换完毕。')

map函数产生的b是迭代器,只能够用一次!如果之前用b做了相关操作,再去用data=xxxxbxxxx的处理代码,那么data将变为一个空矩阵。 

下面解释一下lamda表达式,lamda x,一开始这个x是输入x为变量。

之后那个pd.Series(1, index = x[pd.notnull(x)])是返回值(lamda相当于匿名函数)

data.as_matrix()是把dataframe类型转换为ndarray类型,也就是矩阵类型,我们来看看有什么区别:

print(data)输出如下
   0  1    2    3
0  a  c    e  NaN
1  b  d  NaN  NaN
2  b  c  NaN  NaN
3  a  b    c    d
4  a  b  NaN  NaN
5  b  c  NaN  NaN
6  a  b  NaN  NaN
7  a  b    c    e
8  a  b    c  NaN
9  a  c    e  NaN


print(data.as_matrix())输出如下
[['a' 'c' 'e' nan]
 ['b' 'd' nan nan]
 ['b' 'c' nan nan]
 ['a' 'b' 'c' 'd']
 ['a' 'b' nan nan]
 ['b' 'c' nan nan]
 ['a' 'b' nan nan]
 ['a' 'b' 'c' 'e']
 ['a' 'b' 'c' nan]
 ['a' 'c' 'e' nan]]


print(pd.DataFrame(list(b)))输出如下
     a    c    e    b    d
0  1.0  1.0  1.0  NaN  NaN
1  NaN  NaN  NaN  1.0  1.0
2  NaN  1.0  NaN  1.0  NaN
3  1.0  1.0  NaN  1.0  1.0
4  1.0  NaN  NaN  1.0  NaN
5  NaN  1.0  NaN  1.0  NaN
6  1.0  NaN  NaN  1.0  NaN
7  1.0  1.0  1.0  1.0  NaN
8  1.0  1.0  NaN  1.0  NaN
9  1.0  1.0  1.0  NaN  NaN

可以看到,dataframe不是列表,ndarray是一个以行为单位的列表对象,是一个可以迭代的对象,这样才能成为我们map函数的作用目标,所以,如果我们把map中的as_matrix去掉就会报错。 

ct = lambda x : pd.Series(1, index = x[pd.notnull(x)]) #转换0-1矩阵的过渡函数
b = map(ct, data.as_matrix()) #用map方式执行

这两行到底什么意思呢?Series是一个类似于字典的类,Series的第一个参数可以是字典也可以是数组,也可以是值,第二个参数就是index,也就是字典中键,就是什么键,对应前面输入的什么值,个数要一样对应,如果键的个数比值的个数多,是不是后面的键赋值为None?如果值的个数比键的个数多,是不是会报错?这里笔者没有尝试,有兴趣朋友可以查一查。

pd.notnull(x)就会输出一个dataframe,如下

a=[['a','b','a','c',None],['b','b','c']]
a=pd.DataFrame(a)
print(pd.notnull(a))


      0     1     2      3      4
0  True  True  True   True  False
1  True  True  True  False  False
值得一提的是:如果当一个矩阵的整体去用,是没有意义的,必须提取出来一行行或者一列列去用。
还有一点,a[3]其实指的是dataframe a 的第四列。不是第四行
print(a[pd.notnull(a)])
print(a[3][pd.notnull(a[3])])
   0  1  2    3    4
0  a  b  a    c  NaN
1  b  b  c  NaN  NaN



0    c
Name: 3, dtype: object

 ct = lambda x : pd.Series(1, index = x[pd.notnull(x)]) #转换0-1矩阵的过渡函数
b = map(ct, data.as_matrix()) #用map方式执行

这里,data.as_matrix()每次把一行数据传入,lamda表达式,作为x,然后提取出这一行不为空值的字符作为键,每一个键对应的值都赋值1,相当于第一行为a:1,c:1,e:1,第二行b:1,d:1,然后最重要的是,用map把每一行得到的Series合并起来,最终生成了一个有空缺值的dataframe,(输出在之前),最后再进行填0操作。

data = pd.DataFrame(list(b)).fillna(0) #实现矩阵转换,空值用0填充,输出如下
print(data)
     a    c    e    b    d
0  1.0  1.0  1.0  0.0  0.0
1  0.0  0.0  0.0  1.0  1.0
2  0.0  1.0  0.0  1.0  0.0
3  1.0  1.0  0.0  1.0  1.0
4  1.0  0.0  0.0  1.0  0.0
5  0.0  1.0  0.0  1.0  0.0
6  1.0  0.0  0.0  1.0  0.0
7  1.0  1.0  1.0  1.0  0.0
8  1.0  1.0  0.0  1.0  0.0
9  1.0  1.0  1.0  0.0  0.0

 

3、DEBUG 打断点 view as dataframe (在下面变量栏,变量名的最右边)可以很方便地看数据的状态。

所以多用dataframe,比较方便

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python 语法小进阶1 的相关文章

随机推荐