Fork me on GitHub

pandas系列3_缺失值处理和apply用法

知识点

  • 空值删除和填充
  • apply、applymap用法
  • shift()用法
  • value_counts()和mean():统计每个元素的出现次数和行(列)的平均值

缺失值和空值处理

概念

空值:空值就是没有任何值,""

缺失值:df中缺失值为nan或者naT(缺失时间),在S型数据中为none或者nan

相关函数

  • df.dropna()删除缺失值
  • df.fillna()填充缺失值
  • df.isnull()
  • df.isna()

官方文档

df.dropna()

函数作用:删除含有空值的行或列,删除缺失值

1
DataFrame.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)
  • axis:维度,0表示index行,1表示columns列,默认为0

  • how:

    • all:全部为缺失值则删除该行或者列
    • any:至少有一个则删除
  • thresh:指定至少出现了thresh个才删除

  • subset:指定在某些列的子集中选择出现了缺失值的列删除,不在子集中不会删除(axis决定行\列)

  • inplace:刷选过缺失值得到的新数据是存为副本还是直接在原数据上进行修改。

1
2
3
4
df = pd.DataFrame({"name": ['Alfred', 'Batman', 'Catwoman'],
"toy": [np.nan, 'Batmobile', 'Bullwhip'],
"born": [pd.NaT, pd.Timestamp("1940-04-25"),pd.NaT]})
df
name toy born
0 Alfred NaN NaT
1 Batman Batmobile 1940-04-25
2 Catwoman Bullwhip NaT
1
2
# 默认参数:删除行,只要有空值就会删除,不替换
df.dropna()
name toy born
1 Batman Batmobile 1940-04-25
1
df.dropna(how='any')
name toy born
1 Batman Batmobile 1940-04-25
1
df.dropna(how='all')  # 全部是空值才会删除
name toy born
0 Alfred NaN NaT
1 Batman Batmobile 1940-04-25
2 Catwoman Bullwhip NaT
1
df.dropna(thresh=2)  # 至少出现两个空值删除
name toy born
1 Batman Batmobile 1940-04-25
2 Catwoman Bullwhip NaT
1
df.dropna(subset=['name', 'born'])
name toy born
1 Batman Batmobile 1940-04-25

df.fillna()

主要作用:填充缺失值

1
DataFrame.fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None, **kwargs)
  • value:使用什么填充缺失值,不同的列可以使用不同的值

  • axis:指定填充维度

  • method:填充方法,不能和value同时出现,避免冲突

      - `ffill`:用缺失值的前一个值进行填充,axis=1:横向填充(前后),axis=0:纵向填充(上下)
      - `backfill、bfill`:缺失值后面的一个填充代替前一个
    
  • limit:填充的次数限制

    1
    2
    3
    4
    5
    6
    df1 = pd.DataFrame([[np.nan, 2, np.nan, 0],
    [3, 4, np.nan, 1],
    [np.nan, np.nan, np.nan, 5],
    [np.nan, 3, np.nan, 4]],
    columns=list('ABCD'))
    df1
    A B C D
    0 NaN 2.0 NaN 0
    1 3.0 4.0 NaN 1
    2 NaN NaN NaN 5
    3 NaN 3.0 NaN 4
    1
    df1.fillna(axis=1, method='ffill') # 横向填充
    A B C D
    0 NaN 2.0 2.0 0.0
    1 3.0 4.0 4.0 1.0
    2 NaN NaN NaN 5.0
    3 NaN 3.0 3.0 4.0
    1
    df1.fillna(axis=0, method='ffill') # 纵向填充
    A B C D
    0 NaN 2.0 NaN 0
    1 3.0 4.0 NaN 1
    2 3.0 4.0 NaN 5
    3 3.0 3.0 NaN 4
    1
    df1.fillna(value=2)  # 缺失值填充2
    A B C D
    0 2.0 2.0 2.0 0
    1 3.0 4.0 2.0 1
    2 2.0 2.0 2.0 5
    3 2.0 3.0 2.0 4
    1
    2
    values = {'A':0, 'B':1, "C":2, "D":3}
    df1.fillna(value=values)
    A B C D
    0 0.0 2.0 2.0 0
    1 3.0 4.0 2.0 1
    2 0.0 1.0 2.0 5
    3 0.0 3.0 2.0 4
    1
    df1.fillna(value=values, limit=2) #  限制填充次数
    A B C D
    0 0.0 2.0 2.0 0
    1 3.0 4.0 2.0 1
    2 0.0 1.0 NaN 5
    3 NaN 3.0 NaN 4
    1
    2
    df1.fillna(value=values, inplace=True)  # inplace表示用新生成的数据代替原来的,而不是副本
    df1 # 原数据已经变化了
    A B C D
    0 0.0 2.0 2.0 0
    1 3.0 4.0 2.0 1
    2 0.0 1.0 2.0 5
    3 0.0 3.0 2.0 4

    df.isnull()df.isna()

    二者都是判断是不是缺失值

    1
    2
    df1.isnull()
    df1.isna()


    如何增加一列数值

1
dates
1
2
3
DatetimeIndex(['2019-09-24', '2019-09-25', '2019-09-26', '2019-09-27',
'2019-09-28', '2019-09-29'],
dtype='datetime64[ns]', freq='D')
1
2
# 在数据df的基础上增加一列E
data = df.reindex(index=dates[0:4], columns=list(df.columns) + ['E'])
1
2
3
# 将E列的前2行设为1
data.loc[dates[0]:dates[1], 'E'] = 1
data
A B C D E
2019-09-24 -1.636419 0.222190 0.504764 0.614839 1.0
2019-09-25 -0.516706 -0.084145 1.191989 0.532722 1.0
2019-09-26 1.841656 -0.917348 0.064767 1.574627 NaN
2019-09-27 0.637159 -1.165726 3.050687 -0.847791 NaN

统计值

1
2
data.mean()  
# data.mean(0) 默认是每个列上的均值
1
2
3
4
5
6
A    0.081423
B -0.486257
C 1.203052
D 0.468599
E 1.000000
dtype: float64
1
data.mean(1)   # 求行轴上的均值
1
2
3
4
5
2019-09-24    0.141075
2019-09-25 0.424772
2019-09-26 0.640926
2019-09-27 0.418582
Freq: D, dtype: float64
1
pd.Series([1, 3, 5, np.nan, 6, 8], index=dates)
1
2
3
4
5
6
7
2019-09-24    1.0
2019-09-25 3.0
2019-09-26 5.0
2019-09-27 NaN
2019-09-28 6.0
2019-09-29 8.0
Freq: D, dtype: float64
1
2
3
# shift函数将结果移动两个单位,广播机制
s = pd.Series([1, 3, 5, np.nan, 6, 8], index=dates).shift(2)
s
1
2
3
4
5
6
7
2019-09-24    NaN
2019-09-25 NaN
2019-09-26 1.0
2019-09-27 3.0
2019-09-28 5.0
2019-09-29 NaN
Freq: D, dtype: float64
1
df.sub(s, axis='index')
A B C D
2019-09-24 NaN NaN NaN NaN
2019-09-25 NaN NaN NaN NaN
2019-09-26 0.841656 -1.917348 -0.935233 0.574627
2019-09-27 -2.362841 -4.165726 0.050687 -3.847791
2019-09-28 -4.284321 -5.942288 -2.905034 -4.137728
2019-09-29 NaN NaN NaN NaN

apply用法(重点)

1
2
3
4
# 求出每列的max 和 min
def f(x):
return pd.Series([x.min(), x.max()], index=["min", "max"])
df.apply(f)
1
2
3
f = lambda x: x.max() - x.min()
df.apply(f)
# df.apply(f, axis="columns") 表示在行上执行
1
2
3
4
5
A    3.478075
B 1.387917
C 2.985920
D 2.643529
dtype: float64

关于applymap函数:得到df数据中浮点值的格式化字符串

1
2
formatFunc = lambda x: "%.2f" % x
df.applymap(formatFunc) # 输出的数据为2位小数

统计每个value出现的次数

1
2
s = pd.Series(np.random.randint(0,7, size=10))
s
1
2
3
4
5
6
7
8
9
10
11
0    3
1 5
2 2
3 4
4 6
5 5
6 4
7 4
8 1
9 3
dtype: int32
1
s.value_counts()
1
2
3
4
5
6
7
4    3
5 2
3 2
6 1
2 1
1 1
dtype: int64

本文标题:pandas系列3_缺失值处理和apply用法

发布时间:2019年10月08日 - 10:10

原始链接:http://www.renpeter.cn/2019/10/08/pandas%E7%B3%BB%E5%88%973-%E7%BC%BA%E5%A4%B1%E5%80%BC%E5%A4%84%E7%90%86.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

Coffee or Tea