1. 程式人生 > 實用技巧 >Python與Pandas各自使用的幾個重要函式

Python與Pandas各自使用的幾個重要函式

Python 的幾個重要函式:

1、Lambda表示式:

語法: lambda argument1, argument2,...,argumentN:expression using arguments
lambda實質上是一個表示式,冒號後面的部分是表示式的返回值,使用它就可以很方便的用於不允許def出現的地方,如列表中或函式的引數中。

例1:引數無預設值,位置引數:

f=lambda x,y,z:x+y+z
print f(1,2,3) # 6

例2:引數有預設值,位置引數,關鍵字引數:

f=lambda a="I", b="Love", c ="Python": a+b+c
f("We") # 'WeLovePython'

f=lambda a="I", b="Love", c ="Python": a+b+c
f(b="Hate") # 'IHatePython'

f=lambda a,b="Love", c="Python": a+b+c # 需要同時有位置引數和關鍵字引數的時候,位置引數靠前。
f("We",b="Hate",c="US") # 'WeHateUS'

例3:求階乘:結合reduce函式(稍後講):

from functools import reduce
n = 6
print(reduce(lambda x,y:x*y,range(1,n+1))) # 720

例4:lambda的巢狀使用:

b = lambda x:lambda y:x+y
a = b(3) # 返回一個lambda表示式: a=lambda y:3+y
print (a(2)) # 實際執行: a=lambda y:3+y a(2) 結果:5
print ((b(2))(2)) # 實際執行: f=lambda y:2+y f(2) 結果:4

相當於:
def f(x):
return lambda y:x+y

a=f(3) # 返回一個lambda表示式: a=lambda y:3+y
print(a(2)) # 實際執行: a=lambda y:3+y a(2) 結果:5
print((b(2))(2)) # 實際執行: f_=lambda y:2+y f_(2) 結果:4

例5:在列表中使用:用於生成跳轉表:

L = [lambda x:x2, lambda x:x3, lambda x:x**4]
for f in L:
print(f(2)) # 4 8 16

例6:lambda 和 if...else 結合使用:

f=lambda x:x2 if (x % 2)==0 else x3
print(f(2)) # 4
print(f(3)) # 27

2、map函式:

語法:map(function, iterable)
第一個引數是函式名或lambda表示式,第二個元素傳入可迭代物件。
作用:使用函式對可迭代物件中的每個元素進行處理,得到map object,可以使用list/set函式轉化為列表/集合:

例1:

l1 = [1,2,3,4,5]
result = map(lambda x:x+1,l1)
print(result) # <map object at 0x000002370FF3BB48>
print(list(result)) # [2, 3, 4, 5, 6]

例2:

result = map(lambda x:"D" if x=="d" else x,s)
print(result) # <map object at 0x000002370FF47B88>
sl=list(result)
print(sl) # ['a', 'b', 'c', 'D', 'e', 'f', 'g']
new_s="".join(sl)
print(new_s) # abcDefg

ss=set(result)
print(ss) # {'f', 'b', 'a', 'e', 'c', 'D', 'g'}

print(str(result)) # <map object at 0x000002370FF47B88>

3、reduce函式:

語法:reduce(function, sequence[,initial=None]) function可以是lambda表示式:
第一個引數是函式,第二個引數為序列(需要能對該序列進行for迴圈即可),第三個引數為initial=None。
作用:利用function函式對sequence進行聚縮,獲得一個數字。

例1:列表求積:

from functools import reduce
ls = [1,2,3,4,5,6,7,8,9]
a = reduce(lambda x,y: x*y, ls,1)
print(a) # 362880

例2:求階乘

from functools import reduce
n = 6
print(reduce(lambda x,y:x*y,range(1,n+1))) # 720

4、filter函式

語法:filter(function, iterable)
第一個引數是function,第二個iteralbel。
作用:過濾,留下使function返回值為True的iteralbel的元素:

例1:# 將列表中的偶數保留:

li=[2,3,4,5,6,7,8,9]
li_new=filter(lambda x:x%2==0,li)
print(list(li_new)) # [2, 4, 6, 8]

例2:# 將年齡大於18歲的剔除

people=[
{'name':'aaa','age':11},
{'name':'bbb','age':18},
{'name':'ccc','age':20}
]
print(list(filter(lambda x:x['age'] <= 18 ,people)))

Pandas中的幾個重要的函式:

Series的幾個函式:

1、map函式:只用於 Series:

語法:Series.map(dict) 或 Series.map(function)
作用:對序列中滿足字典或函式規定的元素進行處理,其中function只接受一個引數,即Series裡對應的每個元素。

例1:把資料集中gender列的男替換為1,女替換為0:
1)使用字典進行對映:

data["gender"] = data["gender"].map({"男":1, "女":0})

2)使用 def函式:

def gender_map(x):
return 1 if x == "男" else 0

data["gender"] = data["gender"].map(gender_map) #注意這裡傳入的是函式名,不帶括號

3) 使用 lambda表示式:

data["gender"] = data["gender"].map(lambda x:1 if x=="男" else 0)

2、apply函式:

語法:Series.apply(function)
作用:apply方法的作用原理和map方法類似,區別在於引數function可以接收多個引數,因此實現的功能可以更復雜。

例1:假設在資料統計的過程中,年齡age列有較大誤差,需要對其進行調整(加上或減去一個值),

由於這個加上或減去的值未知,故在定義函式時,需要加多一個引數bias,此時用map方法是操作不了的(傳入map的函式只能接收一個引數),
apply方法則可以解決這個問題:
def apply_age(x,bias):
return x+bias

# 以args=元組的方式傳入額外的引數
data["age"] = data["age"].apply(apply_age,args=(-3,)) # 預設的引數就是Series裡的元素
data["age"] = data["age"].apply((lambda x,bias:x+bias),args=(-3,))
data["age"] = data["age"].apply(lambda x:x-3) # 如果 bias=-3是固定的,可以直接這樣。

例2:map和apply在function只接受一個引數時,效果一樣:

import pandas as pd
import numpy as np

df_hz["淨重是否一致?"]=df_hz["淨重是否一致?"].apply(lambda x:"一致"if x==True else "不一致")
df_hz["淨重是否一致?"]=df_hz["淨重是否一致?"].map(lambda x:"一致" if x==True else "不一致")

df = pd.DataFrame(np.random.rand(2, 2), columns=list('AB')) # 形狀為2x2的0-1之間的數構成的dataframe
print(df)
df["A"]=df["A"].apply((lambda x,y:x+y),args=(1,))
print(df)

df_score = pd.DataFrame(np.random.rand(2, 2)*100, columns=list('AB')) # 形狀為2x2的0-1之間的數構成的dataframe
print(df_score)
df_score["A"]=df_score["A"].apply(lambda x:"優秀"if x>=80 else "一般")
print(df_score)

df_score2 = pd.DataFrame(np.random.rand(2, 2)*100, columns=list('AB')) # 形狀為2x2的0-1之間的數構成的dataframe
print(df_score2)
df_score2["A"]=df_score2["A"].map(lambda x:"優秀"if x>=80 else "一般")
print(df_score2)

DataFrame的幾個函式:

1、apply函式:

語法:dataframe.apply(function,axis=0)
作用:對dataframe的多行或多列或整個dataframe的每行或每列(Series)進行操作,根據function的型別(普通函式或聚合函式),返回dataframe或聚合Series。
function接收的引數是序列,而不是元素。

例1:

df = pd.DataFrame(np.random.rand(6, 3), columns=list('ABC'))
print(df)
df1=df.apply(lambda x:x*100,axis=1) # x為行Series,按行操作元素,返回一個結構和原dataframe一樣的新的dataframe
print(df1)
A B C
0 33.538653 71.249145 5.037846
1 33.046605 19.985572 82.762447
2 14.170736 96.949203 19.425454
3 57.596054 8.871985 84.138249
4 60.109552 46.197523 36.904565
5 41.205720 64.347780 74.839440

df2=df[["A","C"]].apply(lambda x:x*-100,axis=0) # x為列Series,按列操作元素,返回一個只含"A"和"C"列的dataframe
print(df2)
A C
0 -42.431966 -15.729176
1 -1.908547 -26.970564
2 -54.378145 -1.202459
3 -64.568167 -9.193546
4 -91.014507 -13.606579
5 -93.857594 -34.910796

例2:

df_new=df[["B","C"]].apply(np.sum, axis=0) # x為列Series,按列求和,返回一個序列 Series
print(df_new)

2、applymap函式:

語法:dataframe.applymap(function)
作用:對DataFrame中的每個元素執行指定函式的操作:

例1:對dataframe中所有元素保留兩位小數:

df = pd.DataFrame(
{
"A":np.random.randn(5),
"B":np.random.randn(5),
"C":np.random.randn(5),
"D":np.random.randn(5),
"E":np.random.randn(5),
}
)
print(df)

df_new=df.applymap(lambda x:"%.2f" % x) # x為元素
df_new=df.apply(lambda x:"%.2f" % x) # 使用apply會報錯,因為 x為series不能作為float使用
print(df_new)

      A         B         C         D         E

0 -1.053736 0.272299 -0.999303 1.022918 0.401127
1 0.129401 0.387668 -1.225724 -0.015265 0.210593
2 0.397829 0.707525 -0.628846 -1.723541 -0.227998
3 0.977949 -0.874221 1.570470 0.818799 0.371058
4 -1.238976 1.072337 -0.076957 -0.204579 -0.708090

   A      B      C      D      E

0 -1.05 0.27 -1.00 1.02 0.40
1 0.13 0.39 -1.23 -0.02 0.21
2 0.40 0.71 -0.63 -1.72 -0.23
3 0.98 -0.87 1.57 0.82 0.37
4 -1.24 1.07 -0.08 -0.20 -0.71

3、apply與applymap的區別:

1)引數有區別,dataframe.apply需要指定axis,dataframe.applymap不需要;
2)引數裡function接收的引數型別不一樣,dataframe.apply的function接收的是Series,dataframe.applymap接收的是單個元素。

例1:驗證型別:

df = pd.DataFrame(
{
"A":np.random.randn(5),
"B":np.random.randn(5),
"C":np.random.randn(5),
"D":np.random.randn(5),
"E":np.random.randn(5),
}
)

df2=df[["A","C"]].apply(lambda x:type(x),axis=0) # 驗證apply裡function接收到的x的型別
df3=df[["A","C"]].applymap(lambda x:type(x)) # 驗證 x的型別
print(df2)

A <class 'pandas.core.series.Series'>
C <class 'pandas.core.series.Series'>
dtype: object

print(df3)
A C
0 <class 'float'> <class 'float'>
1 <class 'float'> <class 'float'>
2 <class 'float'> <class 'float'>
3 <class 'float'> <class 'float'>
4 <class 'float'> <class 'float'>