知识点
- 空值删除和填充
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 | df = pd.DataFrame({"name": ['Alfred', 'Batman', 'Catwoman'], |
name | toy | born | |
---|---|---|---|
0 | Alfred | NaN | NaT |
1 | Batman | Batmobile | 1940-04-25 |
2 | Catwoman | Bullwhip | NaT |
1 | # 默认参数:删除行,只要有空值就会删除,不替换 |
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
6df1 = 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'))
df1A 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
2values = {'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
2df1.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
2df1.isnull()
df1.isna()
如何增加一列数值
1 | dates |
1 | DatetimeIndex(['2019-09-24', '2019-09-25', '2019-09-26', '2019-09-27', |
1 | # 在数据df的基础上增加一列E |
1 | # 将E列的前2行设为1 |
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 | data.mean() |
1 | A 0.081423 |
1 | data.mean(1) # 求行轴上的均值 |
1 | 2019-09-24 0.141075 |
1 | pd.Series([1, 3, 5, np.nan, 6, 8], index=dates) |
1 | 2019-09-24 1.0 |
1 | # shift函数将结果移动两个单位,广播机制 |
1 | 2019-09-24 NaN |
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 | # 求出每列的max 和 min |
1 | f = lambda x: x.max() - x.min() |
1 | A 3.478075 |
关于applymap函数:得到df数据中浮点值的格式化字符串
1 | formatFunc = lambda x: "%.2f" % x |
统计每个value出现的次数
1 | s = pd.Series(np.random.randint(0,7, size=10)) |
1 | 0 3 |
1 | s.value_counts() |
1 | 4 3 |