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函数对数据进行整理。
原来的数据为:
a | c | e | |
b | d | | |
b | c | | |
a | b | c | d |
a | b | | |
b | c | | |
a | b | | |
a | b | c | e |
a | b | c | |
a | c | e | |
#使用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(使用前将#替换为@)