參考書目:《深入淺出Pandas:利用Python進行數據處理與分析》
pandas的數據可以使用函數便捷方法去操作
先讀取案例數據
import numpy as np
import pandas as pd
data = 'https://www.gairuo.com/file/data/dataset/team.xlsx'
df = pd.read_excel(data)
# 對 df 多重應用多個函數
f(g(h(df), arg1=a), arg2=b, arg3=c)
# 用 pipe 可以把它們連接起來
(df.pipe(h)
.pipe(g, arg1=a)
.pipe(f, arg2=b, arg3=c)
)
# 以下是將 'arg2' 參數給函數 f 然後作為函數整體授受後邊的參數
(df.pipe(h)
.pipe(g, arg1=a)
.pipe((f, 'arg2'), arg1=a, arg3=c) )
# 定義一個函數,給所有Q的成績加 n,然後增加平均數 列
# 其中 n 中要加的值,為必傳參數
def add_mean(rdf, n):
df = rdf.copy()
df = df.loc[:,'Q1':'Q4'].applymap(lambda x: x+n)
df['avg'] = df.loc[:,'Q1':'Q4'].mean(1)
return df
# 調用
df.pipe(add_mean, 100)
# 其中 xy 是變量,df_ 是前邊的數據內容
#篩選Q1大於80且Q2小於等於90 的數據
df.pipe(lambda df_, x, y: df_[(df_.Q1 >= x) & (df_.Q2 <= y)], 80, 90)
df.name.apply(lambda x:x.lower())#變小寫
df.apply(max) # 所有列的最大值
df.apply(lambda x: x*2) # 所有列的值乘於2 = df * 2
df.Q1.apply(lambda x: x+10 if type(x) is int else x) # 所有數字加10
df.loc[:,'Q1':'Q4'].apply(sum, axis=1) # 指定列橫向相加
df.apply(pd.Series.first_valid_index) #pandas的函數
df.apply([sum, 'count']) # 相當於 .aggregate, 即.agg
df.apply({'Q1':sum, 'Q2':'count'}) # 同上
def mymax(x):
return x.max()
df.apply(lambda x:mymax(x)) # 應用函數
# 判斷一個值是否在另外一個類似列表的列中
df.apply(lambda x: x.s in x.s_list, axis=1) # 布爾序列
df.apply(lambda x: x.s in x.s_list, axis=1).astype(int) # 0 和 1 序列
#去掉一個最高分和最低分求不同Q的均值
def my_mean(s):
max_min_ser=pd.Series([-s.max(),-s.min()])
return s.append(max_min_ser).sum()/(s.count()-2)
df.select_dtypes(include='number').apply(my_mean)
#去掉一個最高分和最低分求學生的平均成績
df.set_index('name').select_dtypes(include='number').apply(my_mean,axis=1)
#一個常用的根據條件輸出結果的案例(使用 numpy 庫 np.where):
fun = lambda x: np.where(x.team=='A' and x.Q1>90, 'good' ,'other')
df.apply(fun, axis=1)
# 同上效果
(df.apply(lambda x:x.team=='A' and x.Q1>90, axis=1)
.map({True:'good', False:'other'}) )
df.apply(lambda x: 'good' if x.team=='A' and x.Q1>90 else 'other', axis=1)
df.applymap(lambda x: x*2) # 所有元素的最大值
df.applymap(lambda x: len(str(x))) # 所有的值長度
df.applymap(lambda x: x+10 if type(x) is int else x) # 所有數字加10
def mylen(x):
return len(str(x))
df.applymap(mylen) # 應用函數
# 對空值不使用函數 pandas 1.2.0+
df.applymap(mylen, na_action='ignore')
#根據輸入對應關系映射值修改內容,用於 Series 對象或 DataFrame 對象的一列。
df.team.map({'A':'一班', 'B':'二班','C':'三班', 'D':'四班',}) # 枚舉替換
df.team.map('I am a {}'.format)
df.team.map('I am a {}'.format, na_action='ignore')
t = pd.Series({'six': 6., 'seven': 7.})
s.map(t)
# 應用函數
def f(x):
return len(str(x))
# 調用
df['name'].map(f)
# 三種情況的判斷
fun = lambda x: (x>60 and '及格') or (x==60 and '60分') or (x<60 and '不及格')
df.Q1.map(fun)
# 利用 np.sign 判斷值為正、負、0的情況,並映射文案
label = {0: '平', 1:'漲', -1:'跌'}
ser.map(np.sign).map(label)
#使用指定軸上的一項或多項操作進行匯總。
df.agg('max')# 每列的最大值
df.agg(['sum', 'min']) # 將所有列聚合產生 sum 和 min 兩行
df.agg({'Q1' : ['sum', 'min'], 'Q2' : ['min', 'max']}) # 系列多個聚合
# 分組後聚合
df.groupby('team').agg('max')
df.Q1.agg(['sum', 'mean'])
def mymean(x):
return x.mean()
df.Q2.agg(['sum', mymean])
# 每列使用不同的方法進行聚合
df.agg(a=('Q1', max),
b=('Q2', 'min'),
c=('Q3', np.mean),
d=('Q4', lambda s:s.sum()+1))
# 按行聚合
df.loc[:,'Q1':].agg("mean", axis="columns")
# 利用 pd.Series.add 方法對所有數據加分
# other 是 add 方法的參數
df.loc[:,'Q1':].agg(pd.Series.add, other=10)
#自身調用函數並返回一個 DataFrame。
df.transform(lambda x: x*2) # 應用匿名函數
df.transform([np.sqrt, np.exp]) # 調用多個函數
df.transform([np.abs, lambda x: x + 1])
df.transform({'A': np.abs, 'B': lambda x: x + 1}) #A列絕對值,B列加一
df.transform('abs')
df.transform(lambda x: x.abs())
# 聚合後按組顯示合計
df.groupby('team').sum()
# 聚合後按原數據結構顯示數據,但在指定位置上顯示聚合計算後的結果
df.groupby('team').transform(sum)
s = pd.Series([1, 2], index=["a", "b"])
s_1 = s
s_copy = s.copy()
s_1 is s # True
s_copy is s # False