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函式對資料進行整理。
原來的資料為:ac
ebdb
cabc
dabb
caba
bcea
bcac
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=***xb***x的處理**,那麼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,比較方便
高階語法python(裝飾器)語法小糖豆。
裝飾器顧名思義就是用於乙個函式的二次加工。舉個例子,我們辛辛苦苦寫好了乙個函式結果現在我們需要加入新的功能,那麼這個時候請問你怎麼做。顯然重新去改一下 如果 量多的話是不划算的。或者說一需要對多個個函式增加同乙個功能,如果貼上複製顯然又是不太高效的這個時候就引入了裝飾器這種東東。現在我們定義乙個函式...
Python高階語法
函式式 程式設計概念 要了解什麼是函式式程式設計 什麼是函式 這兩者的區別 高階函式的特點 能接收函式作為引數 注意 map 是 python 內建的高階函式,它接收乙個函式 f和乙個list,並通過把函式 f 依次作用在 list 的每個元素上,得到乙個新的 list 並返回。reduce 函式也...
Python高階語法
最近重新看了網上的python教程,補充學習了一些之前用的較少的用法 字典 注意字典中 key 是亂序的,也就是說和插入 的順序是不一致的。如果想要使用順序一致的字典,請使用 collections 模組 中的 ordereddict 物件 迭代器 python 中的 for 句法實際上實現了設計模...