利用pandas对缺失值进行处理

许多原始数据集中会包含缺失值,这里总结一下常见的对缺失值的处理方式,以及如何通过pandas进行实际操作。

生成一个包含缺失值的DataFrame

通过如下代码,可以构造一个包含缺失值的DataFrame。这里用到一个小技巧,首先我们通过numpy的random方法构造了一个包含随机值的DataFrame,然后,用reindex方法添加了几个新的index,这样DataFrame里新增行的初始值就是NaN了。后面我们都通过这种方法,在原始DataFrame的基础上构造包含缺失值的DataFrame。

  • 代码:
import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f', 'h'],columns=['one', 'two', 'three'])
print(df)
print('\n')

df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
print(df)
  • 输出:
        one       two     three
a -0.579503  0.423280  0.452675
c -0.468805 -0.321307  0.891258
e  0.168585  1.008384 -0.630137
f  0.574003 -1.347813 -0.951535
h -0.529655 -1.068217 -0.919875


        one       two     three
a -0.579503  0.423280  0.452675
b       NaN       NaN       NaN
c -0.468805 -0.321307  0.891258
d       NaN       NaN       NaN
e  0.168585  1.008384 -0.630137
f  0.574003 -1.347813 -0.951535
g       NaN       NaN       NaN
h -0.529655 -1.068217 -0.919875

缺失值检测

pandas提供了缺失值的检测方法isnull,该方法通过布尔值的形式反馈某个值是否为缺失值。这样就可以便于观测缺失值,以及后续进一步地通过编程的方法批量地处理缺失值。isnull还有一个镜像方法notnull,以应对不同的编程场景。

  • 代码:
import pandas as pd
import numpy as np
 
df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f',
'h'],columns=['one', 'two', 'three'])

df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
print(df)
print('\n')

print(df['one'].isnull())
  • 输出:
        one       two     three
a -0.146791 -2.330160 -1.499680
b       NaN       NaN       NaN
c -1.581122  0.734590  0.152708
d       NaN       NaN       NaN
e  0.175039 -0.477513 -2.184527
f  0.137429  2.458390 -0.452975
g       NaN       NaN       NaN
h  0.102433  0.729506  1.236861


a    False
b     True
c    False
d     True
e    False
f    False
g     True
h    False
Name: one, dtype: bool

缺失值在求和运算中的行为

如果对一个包含缺失值的列进行求和运算时,缺失值会被当作0来处理。

  • 代码:
import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(2, 3), index=['a', 'c'],columns=['one', 'two', 'three'])

df = df.reindex(['a', 'b', 'c'])
print(df)
print('\n')
print(df['one'].sum())
  • 输出:
        one       two     three
a -0.590257  0.941664 -0.320593
b       NaN       NaN       NaN
c -0.237803  0.196062  0.323316

-0.8280594903026121

用一个标量值填充缺失值

最简单的缺失值处理方法就是指定一个标量值来进行填充,比如0。

  • 代码
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(3, 3), index=['a', 'c', 'e'],columns=['one',
'two', 'three'])
df = df.reindex(['a', 'b', 'c'])
print(df)
print("\nNaN replaced with '0':")
print(df.fillna(0))
  • 输出:
        one       two     three
a  0.667195 -2.287430  0.261266
b       NaN       NaN       NaN
c  0.568405 -0.860137 -1.784247

NaN replaced with '0':
        one       two     three
a  0.667195 -2.287430  0.261266
b  0.000000  0.000000  0.000000
c  0.568405 -0.860137 -1.784247

用临近值填充缺失值

另一个思路是用缺失值附近的值来对其进行填充,这种方法适用于一段连续数据,例如时间序列。pandas提供了pad/fill方法来进行前向填充(用缺失值之前的数据来进行填充),也可以使用bfill/backfill方法来进行后向填充。

  • 代码
import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f',
'h'],columns=['one', 'two', 'three'])
df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
print(df)
print ("\nNaN replaced with forward values:")
print (df.fillna(method='pad'))
  • 输出:
        one       two     three
a  1.669808 -0.034507 -1.756447
b       NaN       NaN       NaN
c  0.988920  0.496142  0.916299
d       NaN       NaN       NaN
e -1.081201 -0.385207 -0.850673
f -1.094450  0.412084 -1.412251
g       NaN       NaN       NaN
h  0.786988  2.220630 -2.125072

NaN replaced with forward values:
        one       two     three
a  1.669808 -0.034507 -1.756447
b  1.669808 -0.034507 -1.756447
c  0.988920  0.496142  0.916299
d  0.988920  0.496142  0.916299
e -1.081201 -0.385207 -0.850673
f -1.094450  0.412084 -1.412251
g -1.094450  0.412084 -1.412251
h  0.786988  2.220630 -2.125072

丢失缺失值

与填充缺失值的思路相比,在数据量足够多或者对数据要求较高的情况下,丢失缺失值未尝不是一个好办法。pandas提供了dropna方法,该方法有一个参数axis(默认值是0),为0时表示丢弃行(通常是一个样本),为1时表示丢弃列(通常是一个特征),可以根据分析结果来选择具体的丢弃方式。下面的代码表示了如何丢弃一行。

  • 代码:
import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f',
'h'],columns=['one', 'two', 'three'])

df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
print(df)
print("\nNaN row dropped:")
print(df.dropna())
  • 输出:
        one       two     three
a -0.493792  0.946581  2.640122
b       NaN       NaN       NaN
c -0.373698  0.461838 -1.692989
d       NaN       NaN       NaN
e  1.593574 -0.713764 -0.208575
f  0.362406 -0.305731  0.400795
g       NaN       NaN       NaN
h -0.094171  1.114953 -0.038143

NaN row dropped:
        one       two     three
a -0.493792  0.946581  2.640122
c -0.373698  0.461838 -1.692989
e  1.593574 -0.713764 -0.208575
f  0.362406 -0.305731  0.400795
h -0.094171  1.114953 -0.038143

总结

本文描述了对缺失值处理的一些常见思路和对应的方法,但在实际应用中,还需要结合数据本身来选择最合适的处理方式。

最后送大家一个支付宝红包😄
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容