Pandas - 9.1 apply应用

Serise的apply方法

import pandas as pd

def my_sq(x):
    return x*x

df = pd.DataFrame({'a':[10,20,30], 
                  'b':[40,50,60]})

sq = df['a'].apply(my_sq)
print(sq)

'''
0    100
1    400
2    900
Name: a, dtype: int64
'''

带有参数的函数,需要额外指定参数,函数的第一个变量是Serise的元素

def my_exp1(x, e):
    return x**e

def my_exp2(e, x):
    return e**x

ex = df['a'].apply(my_exp1, e=2)
print(ex)

'''
0    100
1    400
2    900
Name: a, dtype: int64
'''

ex = df['a'].apply(my_exp2, x=2)
print(ex)

'''
0    100
1    400
2    900
Name: a, dtype: int64
'''

DataFrame的apply方法

DataFrame需要指定按行还是按列应用函数

按列应用,apply()的axis参数设为0(默认)

def avg_3(x, y, z):
    return (x + y + z)/3

print(df.apply(avg_3))
# 报错
# TypeError: avg_3() missing 2 required positional arguments: 'y' and 'z'
# 整列传递到第一个参数,第二第三参数没有传入值
def avg_3_apply(row):
    x = row[0]
    y = row[1]
    z = row[2]
    return (x + y + z)/3

print(df.apply(avg_3_apply))

'''
a    20.0
b    50.0
dtype: float64
'''

按行应用,apply()的axis参数设为1

def avg_2_apply(row):
    x = row[0]
    y = row[1]
    return (x + y)/3

print(df.apply(avg_2_apply, axis=1))

'''
0    16.666667
1    23.333333
2    30.000000
dtype: float64
'''

apply高级用法

需求:计算titanic每一行或每一列的完整案例(不含缺失值)的百分比

titanic = sns.load_dataset('titanic')命令会因为网络原因报错
URLError: <urlopen error [Errno 11004] getaddrinfo failed>
需要手动下载,然后从本地导入 https://github.com/mwaskom/seaborn-data
cache=True时,会根据data_home的路径来加载数据集

import seaborn as sns
titanic = sns.load_dataset('titanic',cache=True,data_home="./seaborn-data")
import numpy as np

def count_missing(vec):
    null_vec = pd.isnull(vec)
    null_count = np.sum(null_vec)
    return null_count

def prop_missing(vec):
    num = count_missing(vec)
    dem = vec.size
    return num / dem

def prop_complete(vec):
    return 1 - prop_missing(vec)
# 按列应用
print(titanic.apply(count_missing))

'''
survived         0
pclass           0
sex              0
age            177
sibsp            0
parch            0
fare             0
embarked         2
class            0
who              0
adult_male       0
deck           688
embark_town      2
alive            0
alone            0
dtype: int64
'''

print(titanic.apply(prop_complete))

'''
survived       1.000000
pclass         1.000000
sex            1.000000
age            0.801347
sibsp          1.000000
parch          1.000000
fare           1.000000
embarked       0.997755
class          1.000000
who            1.000000
adult_male     1.000000
deck           0.227834
embark_town    0.997755
alive          1.000000
alone          1.000000
dtype: float64
'''

# 按行应用
print(titanic.apply(count_missing, axis=1))

'''
0      1
1      0
2      1
3      0
4      1
      ..
886    1
887    0
888    2
889    0
890    1
Length: 891, dtype: int64
'''

print(titanic.apply(prop_complete, axis=1))

'''
0      0.933333
1      1.000000
2      0.933333
3      1.000000
4      0.933333
         ...   
886    0.933333
887    1.000000
888    0.866667
889    1.000000
890    0.933333
Length: 891, dtype: float64
'''
# 添加缺失信息,并抽取部分观察
titanic['num_missing'] = titanic.apply(count_missing, axis=1)
print(titanic.head())

print(titanic.loc[titanic.num_missing > 1, :].sample(10))

'''
     survived  pclass     sex  age  sibsp  parch     fare embarked   class  \
768         0       3    male  NaN      1      0  24.1500        Q   Third   
364         0       3    male  NaN      1      0  15.5000        Q   Third   
77          0       3    male  NaN      0      0   8.0500        S   Third   
420         0       3    male  NaN      0      0   7.8958        C   Third   
568         0       3    male  NaN      0      0   7.2292        C   Third   
409         0       3  female  NaN      3      1  25.4667        S   Third   
481         0       2    male  NaN      0      0   0.0000        S  Second   
497         0       3    male  NaN      0      0  15.1000        S   Third   
413         0       2    male  NaN      0      0   0.0000        S  Second   
240         0       3  female  NaN      1      0  14.4542        C   Third   

       who  adult_male deck  embark_town alive  alone  num_missing  
768    man        True  NaN   Queenstown    no  False            2  
364    man        True  NaN   Queenstown    no  False            2  
77     man        True  NaN  Southampton    no   True            2  
420    man        True  NaN    Cherbourg    no   True            2  
568    man        True  NaN    Cherbourg    no   True            2  
409  woman       False  NaN  Southampton    no  False            2  
481    man        True  NaN  Southampton    no   True            2  
497    man        True  NaN  Southampton    no   True            2  
413    man        True  NaN  Southampton    no   True            2  
240  woman       False  NaN    Cherbourg    no  False            2  
'''
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,723评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,003评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,512评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,825评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,874评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,841评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,812评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,582评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,033评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,309评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,450评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,158评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,789评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,409评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,609评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,440评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,357评论 2 352

推荐阅读更多精彩内容