天天看点

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()

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

DataFrame.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)           

复制

  • axis

    :维度, 表示

    index

    行,

    1

    表示

    columns

    列,默认为0
  • how:

    • all:

      全部为缺失值则删除该行或者列
    • any:

      至少有一个则删除
  • thresh

    :指定至少出现了thresh个才删除
  • subset

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

    :刷选过缺失值得到的新数据是存为副本还是直接在原数据上进行修改。
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
Alfred NaN NaT
1 Batman Batmobile 1940-04-25
2 Catwoman Bullwhip NaT
# 默认参数:删除行,只要有空值就会删除,不替换
df.dropna()           

复制

name toy born
1 Batman Batmobile 1940-04-25
df.dropna(how='any')           

复制

name toy born
1 Batman Batmobile 1940-04-25
df.dropna(how='all')  # 全部是空值才会删除           

复制

name toy born
Alfred NaN NaT
1 Batman Batmobile 1940-04-25
2 Catwoman Bullwhip NaT
df.dropna(thresh=2)  # 至少出现两个空值删除           

复制

name toy born
1 Batman Batmobile 1940-04-25
2 Catwoman Bullwhip NaT
df.dropna(subset=['name', 'born'])           

复制

name toy born
1 Batman Batmobile 1940-04-25

df.fillna()

主要作用:填充缺失值

DataFrame.fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None, **kwargs)           

复制

dates           

复制

DatetimeIndex(['2019-09-24', '2019-09-25', '2019-09-26', '2019-09-27',
               '2019-09-28', '2019-09-29'],
              dtype='datetime64[ns]', freq='D')           

复制

# 在数据df的基础上增加一列E
data = df.reindex(index=dates[0:4], columns=list(df.columns) + ['E'])           

复制

# 将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

统计值

data.mean()  
# data.mean(0)  默认是每个列上的均值           

复制

A    0.081423
B   -0.486257
C    1.203052
D    0.468599
E    1.000000
dtype: float64           

复制

data.mean(1)   # 求行轴上的均值           

复制

2019-09-24    0.141075
2019-09-25    0.424772
2019-09-26    0.640926
2019-09-27    0.418582
Freq: D, dtype: float64           

复制

pd.Series([1, 3, 5, np.nan, 6, 8], index=dates)           

复制

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           

复制

# shift函数将结果移动两个单位,广播机制
s = pd.Series([1, 3, 5, np.nan, 6, 8], index=dates).shift(2)  
s           

复制

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           

复制

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用法(重点)

# 求出每列的max 和 min
def f(x):
    return pd.Series([x.min(), x.max()], index=["min", "max"])
df.apply(f)           

复制

f = lambda x: x.max() - x.min()
df.apply(f)
# df.apply(f, axis="columns") 表示在行上执行           

复制

A    3.478075
B    1.387917
C    2.985920
D    2.643529
dtype: float64           

复制

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

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

复制

统计每个value出现的次数

s = pd.Series(np.random.randint(0,7, size=10))
s           

复制

0    3
1    5
2    2
3    4
4    6
5    5
6    4
7    4
8    1
9    3
dtype: int32           

复制

s.value_counts()           

复制

4    3
5    2
3    2
6    1
2    1
1    1
dtype: int64           

复制

本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!

本文分享自作者个人站点/博客

http://www.renpeter.cn

复制

如有侵权,请联系 [email protected] 删除。